Константин Константинович Берлинский

Основы нейросетей


Скачать книгу

S) – двумерный битовый массив 100*100. В каждую позицию записываем 0 или 1 в соответствии с тем, закрашена ли точка в той же позиции в файле.

      Делаем 2-ой слой (ассоциативный A) – трехмерный числовой массив N*100*100. Где N – число образов, которые должна распознавать наша НС. В данном случае N=10, т.к. нам нужно распознать числа 0..9, т.е. всего 10 цифр / образов. В каждую позицию [N, i, j] записываем число х в соответствии с тем, насколько часто встречается закрашенная точка в той же позиции для цифры 0..9.

      Как посчитать Xij для каждого образа? Прогоняем много файлов 100*100 где по-разному записана цифра 0..9. Если для цифры точка закрашена прибавляем 1 к Xij, иначе убавляем 1.

      Т.е. для цифры 1, например, матрица будет такая, что по краям будут сильно отрицательные значения. А в полоске посередине все более положительные.

      И наконец, делаем 3ий слой (реагирующий R) – одномерный числовой массив размерности N. При поступлении картинки для распознавания НС считает число совпадений точек для каждого из образов 0..9. Т.е. для каждой точки смотрим, если она закрашена, то в позицию R[n] прибавляем значение из 2го слоя A[n, i, j].

      В итоге получаем для каждого эталонного образа 0..9 финальную оценку R[n], которая говорит насколько картинка похожа на эти образы. Для удобства, эти баллы можно нормализовать и получить, например, что на "8" картинка похожа с вероятностью 85%, а на "3" с вероятностью 60% и так далее. Можно настроить выход третьего слоя, чтобы он давал только одно значение – число с максимальной полученной вероятностью в случае если эта вероятность >80%. А если вероятность меньше, то считать что цифра не распознана.

      Вот в принципе и всё. Кстати, эта штука с 3-мя слоями называется перцептрон. Он считается простейшим, т.к. у него только один внутренний A-слой.

      Можно сделать НС с несколькими внутренними A-слоями. Например, один A-слой распознает отдельно лапы, хвост, морду и шерсть собак. А 2ой A-слой пользуется 1м и знает, какие лапы и другие причиндалы у определенных пород собак.

      Или первый слой распознает буквы, 2-ой слова из букв, а 3ий понимает, полученный текст спам или нет. Плюс 2-ой слой влияет на 1ый. Например, в английском языке есть артикль the и если есть слово из 3х букв и первые 2 – "th", то 3ий слой ненавязчиво советует 2-му слою, что 3-я буква "e". Это рекуррентные НС.

      В реальности считаются не "число попаданий точки и умножение на весовой коэффициент", а хитрая математическая магия: сигмоидальная функция, метод градиентного спуска, метод обратного распространения ошибки и прочая нечисть.

      Что из этого всего следует:

      1) для приемлемого качества НС нужно обучать гигантским количеством данных.

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

      3) для обучения нужны огромные вычислительные ресурсы на парсинг данных, подсчет коэффициентов и др.

      4) исходные данные нужно нормализовать – при распознавании текста из графического файла резать текст на слова и буквы, поворачивать изображение, чтобы оно было без наклона, увеличивать или уменьшать, сделать монохромным, убирать шумы и др.

      5) цикл обучения НС нужно повторять с разными настройками (размер матриц, пороговые вероятности), чтобы получить лучшую НС.

      6) что хорошо – обучить НС можно один раз на мощностях