GotAI.NET

Форум: Проблемы искусственного интеллекта

 

Регистрация | Вход

 Все темы | Новая тема Стр.3 (5)<< < Пред. | След. > >>   Поиск:  
 Автор Тема: На: Сверточная нейронная сеть Михайло
Михайло
Сообщений: 2366
На: Сверточная нейронная сеть Михайло
Добавлено: 20 ноя 18 19:24
Ага, теперь удалось достичь результата 97,4%, прогнав 40000 обучающих примеров за 46 минут.

На рисунке показаны 52 ошибки на 2000 тестовых примерах. Красные подписи - это предсказание:

Честно говоря, в некоторых случаях даже я не могу дать правильный ответ. Только благодаря подсказке, что нейросеть однозначно ошиблась, можно дать более точный ответ.

Матрица ошибок 10х10. По горизонтали правильный ответ 0...9, по вертикали какой ответ был от нейросети 0...9. В клетках матрицы - счетчики ответов. Идеальная матрица ошибок - это когда все счетчики вне главной диагонали равны нулю.
[Ответ][Цитата]
Вольфрамовый клaпaн
Сообщений: 13070
На: Сверточная нейронная сеть Михайло
Добавлено: 20 ноя 18 22:46
[Ответ][Цитата]
гость
109.70.100.*
На: Сверточная нейронная сеть Михайло
Добавлено: 21 ноя 18 7:29
Цитата:
Автор: Михайло

Ага, теперь удалось достичь результата 97,4%, прогнав 40000 обучающих примеров за 46 минут.
97,4% уже неплохо, это близко к максимальным результатам обычных моделей с достаточной полнотой(MLP, KNN, RF etc.) c не рафинированными данными(яркостями пикселей как признаками). Но нужно учить и тестировать на оригинальных данных(60к\10к) иначе цифры имеют иной смысл
[Ответ][Цитата]
Victor G. Tsaregorodtsev
Сообщений: 3187
На: Сверточная нейронная сеть Михайло
Добавлено: 25 ноя 18 9:06
Цитата:
Автор: Михайло
Ага, теперь удалось достичь результата 97,4%

Я чота ржу
Обычный MLP с 150 нейронами на скрытом слое даёт 98%ую точность обобщения.

И даже ОДНОСЛОЙНЫЙ, из всего 10 нейронов (выходных, иных нейронов в нём не будет) тоже даёт такую же точность. Правда, для этого нейронам нужно поставить полиномиальные сумматоры (но выше, чем вторая степень полинома - лезть не нужно). И обучение будет в разы дольше (потому, что синапсов у этого однослойного персептрона станет сильно больше, чем у многослойного со 150тью обычными нейронами на скрытом слое).

В общем, до правильно работающих свёрточных сеток Вы ещё не добрались. Разбирайтесь, в чём проблема - в ошибках в коде и/или в говноархитектурах.

Цитата:
Автор: Михайло
прогнав 40000 обучающих примеров за 46 минут.

Тоже чота ржу
Даже если это не одна эпоха - а несколько десятков эпох обучения нейронки.
[Ответ][Цитата]
Михайло
Сообщений: 2366
На: Сверточная нейронная сеть Михайло
Добавлено: 26 ноя 18 11:16
Я постепенно переводил код из вычисления в многомерных массивах в линейные массивы с работой по указателям. Удалось ускорить код примерно на 40%.

Запустил аналогичный код на Keras, он работает примерно в 8 раз быстрее. Keras использует все два ядра моего старенького Core Duo, мой же код нагружает систему на одно ядро (50%). Сделать параллельное вычисление в потоках нетрудно, но осталось решить, где взять ещё ускорителя 4х.

Думаю, надо попробовать уменьшить точность вычисления, заменить double (64 разряда) на float (32 разряда). А лучше всего написать какие-нибудь оптимизированные целочисленные эквиваленты. Для этого можно привлечь ребят из моей фирмы, возможно у них возникнет спортивный интерес.
[Ответ][Цитата]
Михайло
Сообщений: 2366
На: Сверточная нейронная сеть Михайло
Добавлено: 30 ноя 18 10:40
Короче, разобрался я, почему Keras быстро работает. Он просто не обрабатывает кромку изображения (по умолчанию не делает padding-обработку в сверточном слое). Я у своего алгоритма сейчас выкусил обработку кромки, и он у меня заработал в 3 раза быстрее. Потом остаётся распределить задачу на оба ядра. И тогда мой алгоритм будет будет прогонять 60000 всего за 9 минут, при том, что Keras это делает за 7 минут.

Сейчас сделаю точное измерение времени для 60000 примеров.
[Ответ][Цитата]
Михайло
Сообщений: 2366
На: Сверточная нейронная сеть Михайло
Добавлено: 30 ноя 18 11:07
Итак, задача MNIST:
- 60000 обучающих примеров
- 10000 тестовых примеров
- batch_size = 200
- n_iter = 10 эпох
- accuracy = 0.9733
- время обучения 1018 сек (~17 мин)
[Ответ][Цитата]
Михайло
Сообщений: 2366
На: Сверточная нейронная сеть Михайло
Добавлено: 30 ноя 18 11:34
Изменено: 30 ноя 18 11:54
Ядро 3х3
Пулинг 2х2

Структура нейросети:
INPUT 28x28@1
CONV 26x26@4
RELU
POOL 13x13@4
CONV 11x11@128
RELU
POOL 5x5@128
FC 3200->10


Сравнение с такой же структурой и параметрами CNN Keras:
accuracy = 0.9875
время работы = 380 сек (6,3 мин)
[Ответ][Цитата]
Victor G. Tsaregorodtsev
Сообщений: 3187
На: Сверточная нейронная сеть Михайло
Добавлено: 02 дек 18 9:42
Цитата:
Автор: Михайло
Запустил аналогичный код на Keras, он работает примерно в 8 раз быстрее.

Я тут в книжном полистал переводную книжку Ф.Шолле - там эпоха обучения MLP Керасом вышла чуть медленнее, чем у меня на Core 2 Duo. Фишка в том, что книжка эта 2017г издания в буржуинии - и автор с вероятностью в 146% пользовался гораздо более быстрым процессором. Т.е. Керас может работать быстрее одного кода - но таки медленнее другого.


Цитата:
Автор: Михайло
Сравнение с такой же структурой и параметрами CNN Keras:
accuracy = 0.9875
время работы = 380 сек (6,3 мин)

Да, подтверждаю достижимую точность 0.99 (т.е. 99% правильности распознавания тестовой выборки) для указанной архитектуры.
Из возможных расхождений настроек - у меня МНКшная целевая функция и tanh-нелинейности у выходных нейронов, ну и пулинг максимумом, но просто потому, что таковы дефолтные настройки в проге, менять и проверять другие было лень.
И я, правда, попримерно учил (без батчей) - но всё равно 10 эпох пролетели чуть меньше чем за 3мин (время по диспетчеру задач, т.е. астрономического времени вышло 1.5мин). Core 2 Duo E8500 3.166ГГЦ (интересно, сколько ещё лет я буду включать этот старый системник ради задач меряния скоростью работы софта?)
[Ответ][Цитата]
гость
162.247.74.*
На: Сверточная нейронная сеть Михайло
Добавлено: 02 дек 18 9:47
Цитата:
Автор: Victor G. Tsaregorodtsev
Core 2 Duo E8500 3.166ГГЦ (интересно, сколько ещё лет я буду включать этот старый системник ради задач меряния скоростью работы софта?)
типа у вас другой есть
в первый раз слышу чтобы кто то включал старый системник для таких целей
[Ответ][Цитата]
Михайло
Сообщений: 2366
На: Сверточная нейронная сеть Михайло
Добавлено: 03 дек 18 20:09
Изменено: 03 дек 18 20:14
Посмотрел, у меня Celeron G1820 2.7 ГГц, так что я ошибся насчет Core Duo.

Меня интересует не абсолютное значение времени (хотя это конечно тоже важно), а оптимальное быстродействие.

Пока ещё есть направления оптимизации:
1. Некоторые оставшиеся оптимизации вычислений в циклах (остались ещё 9 умножений, которых можно избежать).
2. Переход на float вместо double или на целочисленные вычисления (есть смысл?).
3. Замена экспоненты exp() на табличную функцию.
4. Оптимизация распараллеливания в потоках (я не доволен ускорением, что тут можно сделать?)
5. Распараллеливание обновления весов (это, конечно, не даст приличного буста).

Как только все варианты будут исчерпаны, я думаю выйду на 10 минут выполнения поставленной задачи.
[Ответ][Цитата]
Михайло
Сообщений: 2366
На: Сверточная нейронная сеть Михайло
Добавлено: 08 дек 18 19:44
В общем пока ситуация такая: оптимизировал вычисления в циклах. Получил честный результат около 15 мин против 6,3 мин в Keras. То есть осталось ускорить примерно 2х.

Пытался я заменить тип данных double на float. Никакого прироста это не дает. Абсолютно.

Провел сравнительные тесты быстродействия вычислений. Оказалось, такие операции как умножение-сложение чисел двойной точности (тип double) выполняются почти также быстро как и сложение-умножение-сравнение чисел типа int32. И даже знаменитый инкремент i++ не более чем в два раза быстрее умножения двух чисел double.

Короче говоря, дальнейшие попытки ускорения нужно производить с точным пониманием того, как компилируется и исполняется код. Иными словами, надо дезассемблировать и анализировать скомпилированный код. Короче, надо погружаться в дебри машинного кода, только тогда можно получить ускорение 2х. На мой взгляд, секрет ускорения должен быть применен не только к операции свертки, но и к пулингу.
[Ответ][Цитата]
Михайло
Сообщений: 2366
На: Сверточная нейронная сеть Михайло
Добавлено: 08 дек 18 19:54
Да, надо ещё протестировать быстродействие операции "разыменовывание указателя" (косвенная адресация в ассемблере).

Только непонятно, как весь этот анализ даст понять, как ускорить код в 2х раз.
[Ответ][Цитата]
Михайло
Сообщений: 2366
На: Сверточная нейронная сеть Михайло
Добавлено: 09 дек 18 1:29
Изменено: 09 дек 18 1:34
Вот позорище! Я запускал код в режиме отладки (debug). Запустил в режиме выпуска (release), сразу выполнение ускорилось в 2 раза. И я получил результат 446 сек (7.38 минуты).

Правда надо разобраться с accuracy, почему-то алгоритм гонит пургу. Где-то ошибка, выход указателя за пределы массива, так как в режиме выпуска результат сильно отличается от результата в режиме отладки.
[Ответ][Цитата]
Victor G. Tsaregorodtsev
Сообщений: 3187
На: Сверточная нейронная сеть Михайло
Добавлено: 09 дек 18 8:09
Цитата:
Автор: Михайло
Пытался я заменить тип данных double на float. Никакого прироста это не дает. Абсолютно.

Ох, сколько нам открытий чудных...

Цитата:
Автор: Михайло
Провел сравнительные тесты быстродействия вычислений. Оказалось, такие операции как умножение-сложение чисел двойной точности (тип double) выполняются почти также быстро как и сложение-умножение-сравнение чисел типа int32.

Вообще-то, всё это не требует никаких сравнительных тестов и написано в общедоступной документации.
[Ответ][Цитата]
 Стр.3 (5)1  2  [3]  4  5<< < Пред. | След. > >>