All streams
Search
Write a publication
Pull to refresh
11
0

Пользователь

Send message

Коллега, я также написал себе в избранное через telethon и получил вечный бан! Я пользовался кодом из https://docs.telethon.dev/en/stable/modules/client.html - await client.send_message('me', 'Hello to myself!'). Потом спустя длительное время я создал новый аккаунт по тому же номеру.

В каких терминалах можно курсор устанавливать кликом мыши?
Например, пишу одну большую строку для выполнения и хочу поставить курсор в нужное место. Мышкой - один клик, но приходится нажимать на кнопки клавиатуры.
Кроме того, можно ли в таком терминале удалить выделенную курсором часть команды?

  1. Почему для всех оптимизаторов используется одинаковый набор learning rates?

  2. Почему в роли метрики качества выбрана accuracy, а не val_accuracy (где выборка валидации — тестовая выборка)?

По поводу первого хочу отметить. Мной были выявлены следующие оптимальные learning rates для некоторых оптимизаторов:
— SGD: 0.1;
— Adam: 0.001;
— AdaBelief: 0.001;
— Adadelta: 2.0 (при таком значении занял 1 место среди других);
— Adagrad: 0.1;
— Adamax: 0.01;
— Nadam: 0.001;
— RMSprop: 0.001.

По поводу второго тоже хочу отметить. Я использовал tensorflow. К сожалению, там я не нашел функционала для выбора наиболее оптимальных параметров сети (на основе всех эпох) в конце обучения (например, 30 эпох проходит, лучшая — 20, после обучения сохраняется в сети именно она, а не результат 30 эпохи). Поэтому пришлось писать:

свой callback
class MyEarlyStopping(tf.keras.callbacks.Callback):
    def __init__(self,
                 monitor='val_accuracy',
                 baseline=0.9,
                 baseline_epochs=1,
                 restore_best_weights=True):
        super(MyEarlyStopping, self).__init__()

        self.monitor = monitor
        self.baseline = baseline
        self.baseline_epochs = baseline_epochs
        self.wait = 0
        self.stopped_epoch = 0
        self.restore_best_weights = restore_best_weights
        self.best_weights = None
        if 'acc' in self.monitor:
            self.monitor_op = np.greater
        else:
            self.monitor_op = np.less

    def on_train_begin(self, logs=None):
        self.wait = 0
        self.stopped_epoch = 0
        self.best = np.Inf if self.monitor_op == np.less else -np.Inf
        self.best_weights = None

    def on_epoch_end(self, epoch, logs=None):
        current = self.get_monitor_value(logs)
        if current is None:
            return
        if self.restore_best_weights and self.best_weights is None:
            self.best_weights = self.model.get_weights()
        if self._is_improvement(current, self.best):
            self.best = current
            self.wait = 0
            if self.restore_best_weights:
                self.best_weights = self.model.get_weights()
        if self._is_improvement(current, self.baseline):
            self.wait = 0
        else:
            self.wait += 1
        if self.wait >= self.baseline_epochs:
            self.stopped_epoch = epoch
            self.model.stop_training = True
            if self.restore_best_weights and self.best_weights is not None:
                self.model.set_weights(self.best_weights)

    def on_train_end(self, logs=None):
        if self.restore_best_weights and self.best_weights is not None:
            self.model.set_weights(self.best_weights)
    
    def get_monitor_value(self, logs):
        logs = logs or {}
        monitor_value = logs.get(self.monitor)
        if monitor_value is None:
            logging.warning('Early stopping conditioned on metric `%s` '
                            'which is not available. Available metrics are: %s',
                            self.monitor, ','.join(list(logs.keys())))
        return monitor_value

    def _is_improvement(self, monitor_value, reference_value):
        return self.monitor_op(monitor_value, reference_value)
model.fit(..., callbacks=[early_stopping], ...)

Продолжить изучение Machine Learning и Data Science вы сможете на наших курсах.

  1. Вводных статей по теме нейронных сетей куча. В том числе с использованием только numpy. Ваша статья (хоть и является переводом) отличается сравнительно малым количеством информации.

  2. Хорошая реклама курса — это не когда вы переводите какую-нибудь главу из книги по нейронным сетям (что может сделать почти любой тех. специалист), а когда вы сами на основе своего опыта можете сделать что-то гораздо большее, чем обучить персептрон на XOR. В статье вы показали только то, что можете перевести главу из книги.

Здесь я не прав по поводу сети «попроще».
Точность от 99.10 до 99.19% на ней достигается при использовании extra training data.
Если говорить о стандартном MNIST, то для точности 99% и выше на тестовой выборке следует использовать сверточную нейронную сеть. Например, следующую:

Описание нейронной сети
=== Settings:
batch_size=500
optimizer=tf.keras.optimizers.Adadelta(learning_rate=5)
loss='categorical_crossentropy'

=== Layers:
1. Conv2D(filters=32, kernel_size=(3, 3), activation='relu', input_shape=(28, 28, 1), padding='same'),
2. MaxPooling2D(pool_size=2, strides=2),
3. Conv2D(filters=48, kernel_size=(3, 3), activation='relu', padding='same'),
4. MaxPooling2D(pool_size=2, strides=2),
5. Dropout(0.5),
6. Flatten(),
7. Dense(500, activation='relu'),
8. Dropout(0.25),
9. Dense(10, activation='softmax')

=== Code:
model = tf.keras.models.Sequential([
                                    tf.keras.layers.Conv2D(filters=32, kernel_size=(3, 3), activation='relu', input_shape=(28, 28, 1), padding='same'),
                                    tf.keras.layers.MaxPooling2D(pool_size=2, strides=2),
                                    tf.keras.layers.Conv2D(filters=48, kernel_size=(3, 3), activation='relu', padding='same'),
                                    tf.keras.layers.MaxPooling2D(pool_size=2, strides=2),
                                    tf.keras.layers.Dropout(0.5),
                                    tf.keras.layers.Flatten(),
                                    tf.keras.layers.Dense(500, activation='relu'),
                                    tf.keras.layers.Dropout(0.3),
                                    tf.keras.layers.Dense(10, activation='softmax')
                                   ])
model.compile(optimizer=tf.keras.optimizers.Adadelta(learning_rate=5), loss='categorical_crossentropy', metrics=['accuracy'])
history = model.fit(train_data, train_labels, validation_data=(test_data, test_labels), batch_size=500, epochs=30)

15 эпох, около 5 минут, точность на обучающей 99.08%, точность на тестовой 99.41%.
Если подождать ещё 15 эпох (5 минут), то результаты ещё лучше — точность на обучающей 99.57%, точность на тестовой 99.52%.
Результаты нейронной сети, предложенной автором, немного хуже (в плане обобщения) — точность на обучающей 99.69% и точность на тестовой ~99.21% (30 эпох).

Из классики на русском — «Фундаментальные алгоритмы на C++. Часть 5. Алгоритмы на графах» Роберта Седжвика и «Совершенный алгоритм. Графовые алгоритмы и структуры данных» Тима Рафгардена.

На английском можно найти больше книг. Можно посмотреть в сторону Amazon (в поиске есть фильтры, в том числе фильтр по целевой аудитории + отзывы развернутые). Там нужно именно выбирать книги по отзывам, а скачивать — на Libgen или на Z-Library.

1. По поводу чисел в графах — они маленькие, а расстояния между вершинами большие. Возможно, у вас какая-то программа генерирует эти изображения. Рекомендую для статей использовать draw.io (там можно и перемещать объекты, и менять размер шрифта и др.).

2. «Но есть еще два способа как можно задавать граф, а точнее представлять его». Если можно написать точнее, то пишите без лишних слов.

3. Неправильные определения плотного и разреженного графов: «... плотных графов в которых количество ребер (E) примерно равно количеству вершин (V)» и «... разреженных графов, то есть графов где количество ребер меньше количества вершин». Откуда прямая связь с числом вершин? Плотный граф — граф, в котором число ребер близко к максимально возможному числу ребер (у полного графа) (см. определение из NIST). Разреженный граф — граф, в котором число ребер намного меньше максимально возможного числа ребер (у полного графа) (см. определение из NIST).

4. Множество орфографических, грамматических и логических ошибок.

Наиболее выделяющиеся ошибки

«Здесь отсутствует дублирование между вершинами, так как если вершина 1 соединена с вершиной 2, наоборот соединена она не может быть, так у нас есть направление у ребра». Конструкция «если ..., то» частично отсутствует.

«В вершину 1 ничего не входит, значит матрица верна». Это не вывод, вы же заранее составляете матрицу, а не доказываете её правильность.

«в нашем случаи». Должно быть «в <?> случае».

5. Перевёрнутую А не используют для обозначения матрицы. Матрицу обозначают буквой M (английской; от слова Matrix), иначе грош цена вашим обозначениям, когда они ни одному учебнику и ни одному стандарту не соответствуют.

Остальное не проверял — потерял интерес.

Теория графов хорошо проработана во многих учебниках. Не совсем понимаю, в чем смысл таких чисто теоретических статей, причем с ошибками. Желательно делать одну статью с краткой теорией и большей по объему практикой.

Upd. Также непонятно, что делает эта статья в хабах «Сетевые технологии», «Машинное обучение» и «Искусственный интеллект».

Это правда. Однако есть более очевидные ошибки, например, в почти идеальных случаях с цифрами 5 и 6:

Screenshot

Думаю, можно опустить этот вопрос, т.к. статья носит больше демонстративный характер.

Точности модели достаточно для примера (~99 % в наборе валидации).

Конечно, можно добиться гораздо лучшего результата.

Здесь можно посмотреть примеры архитектур и их результат на MNIST.

Кроме того, можно ради интереса попробовать сеть попроще: Dropout(0.4), Dense(250, linear), Relu(), Dense(250, linear), Relu(), Dense(10, linear) с оптимизатором Adadelta(lr=5), инициализацией параметров xavier normal normalized и batch_size=500 (у меня получается после 500 эпох лучший результат со 100% точностью на обучающей и от 99.10 до 99.19% точностью на тестовой выборках; обучение не более 15 минут).

Единственный вопрос — зачем? Цель всегда должна быть в любой статье. Иначе получаем «статья для статьи».

Вы пишете, что это некая «игрушка». Но я могу смотреть на это только как на placeholder text generator (генератор бессмысленного текста-заполнителя по типу lorem ipsum). Других применений не вижу.

Да, важную деталь я упустил. MNIST содержит 13 ошибочно размеченных ТЕСТОВЫХ образцов. 99,87 — максимально возможная точность. И ровно этой точности достиг «Branching/Merging CNN + Homogeneous Vector Capsules» в 2020 году. Лучше быть не может, как я понял.

на игрушечной задаче по распознаванию цифр из датасета MNIST

В чем заключается «игрушечность»?

  1. Судя по результатам классификации, на тестовой выборке 100% точности никто не достиг. В целом, оно и не сильно требуется — часть ошибочно распознанных образцов сам человек распознает с трудом.

  2. До сих пор учёные пишут статьи, где демонстрируют работу своих нейронных сетей в том числе и на MNIST.

Также в идеале было бы неплохо представить тестирующий код.

В целом, статья полезная.

Значения в столбце «Время вычисления» выглядят странно. Это среднее? Или просто один запуск? В идеале нужно приводить доверительный интервал для среднего на основе нескольких запусков (можно попробовать хотя бы 10 запусков).

1. В коде у вас встречается знак «—». Это знак тире. Ожидалось: «-» (дефис, который играет роль минуса). В частности здесь:
p — ;

2. Также обратите внимание на лишние пробелы. В частности здесь:
return — 1;

3. Не хватает:
— Асимптотика (по времени и памяти; для случаев с использованием таблицы смещений, таблицы суффиксов);
— Достоинства и недостатки алгоритма и его эвристик (когда эффективна та или иная эвристика по отдельности, а когда эффективны обе и почему);
— Анализ влияния используемого алфавита, числа символов в строке, числа символов в подстроке на время выполнения (также сравнение с линейным поиском в этом же смысле) — это, скорее всего, на пятерку с плюсом.
4. Название статьи нужно сделать конкретнее. Например, «Алгоритм поиска строки Бойера — Мура».
1. «Какие ограничения это накладывает на применение критерия?»
Все ограничения связаны по большей части с необратимостью матрицы ковариаций.
Многое зависит от цели исследования. Все ограничения не описать в одном сообщении.
Можно привести одно ограничение, которое не было рассмотрено в статье — при расчете расстояния Махаланобиса между двумя классами по принципу центроида можно натолкнуться на редкий случай, когда два класса не совпадают, но имеют одинаковые центроиды (по сути один класс окружен другим), и расстояние, соответственно, равно 0 (опять же, по принципу центроида). Это ограничение устраняет расстояние Бхаттачарьи.
Вкратце — все зависит от ситуации.

2. «Является ли сферичность множества следствием нормальности распределения?»
Вопрос: «Если точки нормально распределены, описывают ли они сферообразное множество?».
Ответ: в общем случае — нет (оно и понятно, сфера — частный случай).
А эллипс в общем случае? Вряд ли. Существует т. н. эллиптическое распределение, которое обобщает многомерное нормальное распределение.

Вопрос: «Если точки описывают сферообразное множество, то они нормально распределены?»
Ответ: да, многомерно нормально распределены.

Расстояние Махаланобиса в общем случае описывает эллипс. Сделал исправление в статье:
«расстояние Махаланобиса предполагает, что точки множества эллипсоидально (частный случай — сферически) распределены вокруг центра масс».

3. «В каких умозрительных примерах критерий может адекватно применяться?»
В приведенных вами примерах теоретически может применяться (практически — нужно проверять).
Я видел следующие применения (статьи с картинками):
— в многоклассовой классификации изображений дистанционного зондирования (статья);
— в кластеризации объектов, изображенных на космических снимках (статья).

Information

Rating
Does not participate
Registered
Activity