Отключить определенные выходные узлы в PyBrain

Я создаю простую нейронную сеть с прямой связью в PyBrain для классификации символов (26 строчных букв, 26 прописных букв и 10 цифр).

Есть два разных документа - в одном только прописные буквы и цифры, а во втором - строчные буквы, цифры и прописные буквы.

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

заранее спасибо

PS: Кто-нибудь знает какие-нибудь действительно (действительно) хорошие учебники по pyBrain? Я новичок, и в документации рассматриваются только очень простые примеры.


person user2118322    schedule 21.03.2013    source источник
comment
Но как он может отключить узлы в верхнем регистре, когда вводятся только строчные? Мой набор данных жалко мал (около 1000 символов), и таким образом прогноз почти всегда неверен. (т.е. одна сеть) В настоящее время у меня есть 2 сети, и прогноз лучше.   -  person user2118322    schedule 23.03.2013


Ответы (2)


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

Прог Нг предлагает очень хороший учебник по распознаванию рукописного ввода в своем классе на курсе (лекции 3 и 4 на http://www.ml-class.org). Я думаю, что урок скоро начнется, и вы найдете его весьма полезным для классификации цифр почерка.

person nitin    schedule 22.03.2013

Неудивительно, что каждая из отдельных сетей дает лучшую производительность на соответствующем тренировочном наборе, на котором она была обучена. Но эти значения ошибки прогнозирования вводят в заблуждение, потому что минимизация ошибки на обучающем наборе является некорректной задачей. Ваша конечная цель — максимизировать эффективность обобщения вашей модели, чтобы она хорошо работала с новыми данными, которые она не видела во время обучения. Представьте себе сеть, которая просто запоминает каждый из символов и, таким образом, работает как хеш-таблица. Такая сеть дала бы 0 ошибок на обучающих данных, но плохо работала бы на других данных.

Одним из способов измерения эффективности обобщения является выделение части (например, 10 %) доступных данных и использование ее в качестве набора тестов. Вы не используете этот тестовый набор во время обучения, только для измерения.

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

Также обратите внимание на другие методы повышения эффективности обобщения вашей сети, такие как регуляризация L1 (вычитание небольшой фиксированной суммы из абсолютного значения ваших весов после каждого шага обучения), регуляризация L2< /em> (вычитание небольшого процента веса после каждого шага тренировки) или Dropout (случайное переключение отключать скрытые юниты во время обучения и уменьшать вектор веса вдвое, как только обучение закончено). Кроме того, вам следует рассмотреть более эффективные алгоритмы обучения, такие как RPROP- или RMSProp, а не простое обратное распространение (см. Курс Джеффри Хинтона по нейронным сетям). Вам также следует рассмотреть набор данных MNIST, содержащий записанные числа 0-9, для тестирования вашей установки (вы должны легко получить менее 300 неправильных классификаций в тестовом наборе).

Чтобы ответить на ваш первоначальный вопрос о том, как пропустить определенные выходные нейроны, вы можете создать собственный модуль слоя. Взгляните на SoftmaxLayer, но перед применением функции активации softmax установите все выходные нейроны в 0, которые принадлежат классам, которые вы хотите пропустить. Вам нужно манипулировать переменной outbuf в _forwardImplementation. Если вы хотите использовать это во время обучения, обязательно установите для этих классов сигнал ошибки равным нулю, прежде чем распространять ошибку на предыдущий уровень (путем манипулирования _backwardImplementation). Это может быть полезно, например. если у вас есть неполные данные и вы не хотите выбрасывать каждую выборку, содержащую только одно значение NaN. Но в вашем случае вам это на самом деле не нужно.

person schreon    schedule 23.03.2013