Деактивирайте определени изходни възли в 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 числа) и по-голям набор от данни, за да обучите тези етикети. Вероятно можете да изградите наборите от данни, като използвате двата документа.

Има много добър урок за разпознаване на ръкописен текст, предложен от Prog Ng в неговия курс по coursera (лекции 3 и 4 на http://www.ml-class.org). Мисля, че часът започва скоро и ще го намерите за доста полезен при класифицирането на цифрите на почерка

person nitin    schedule 22.03.2013

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

Един от начините за измерване на ефективността на обобщаването е да извлечете част (напр. 10%) от вашите налични данни и да ги използвате като тестова група. Не използвате този тестов комплект по време на тренировка, а само за измерване.

Освен това трябва да проверите топологията на вашата мрежа. Колко скрити слоя и колко неврона на скрит слой използвате? Уверете се, че вашата топология е достатъчно голяма, за да може да се справи със сложността на вашия проблем.

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

За да отговорите на първоначалния си въпрос как да пропуснете определени изходни неврони, можете да създадете собствен модул на слоя. Разгледайте SoftmaxLayer, но преди да приложите функцията за активиране на softmax, задайте всички изходни неврони на 0, които принадлежат към класовете, които искате да пропуснете. Трябва да манипулирате променливата outbuf в _forwardImplementation. Ако искате да използвате това по време на обучение, уверете се, че сте задали сигнала за грешка на нула за тези класове, преди да прехвърлите обратно грешката към предишния слой (чрез манипулиране на _backwardImplementation). Това може да бъде полезно напр. ако имате непълни данни и не искате да изхвърлите всяка проба, съдържаща само една NaN стойност. Но във вашия случай всъщност нямате нужда от това.

person schreon    schedule 23.03.2013