Нейронные сети Matlab - плохие результаты - PullRequest
2 голосов
/ 20 декабря 2011

У меня проблема с реализацией многослойного персептрона с помощью Matlab Neural Networks Toolkit.

Я пытаюсь реализовать нейронную сеть, которая распознает один символ, хранящийся в виде двоичного изображения (размер 40x50). Изображение преобразуется в двоичный вектор. Выход кодируется в 6 битах. Таким образом я использую простую функцию newff (с 30 персептронами в скрытом слое):

net = newff(P, [30, 6], {'tansig' 'tansig'}, 'traingd', 'learngdm', 'mse');

Затем я тренирую свою сеть с дюжиной символов в 3 разных шрифтах со следующими параметрами поезда:

net.trainParam.epochs=1000000;
net.trainParam.goal = 0.00001;
net.traxinParam.lr = 0.01;

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

Как я могу улучшить эту простую сеть?

Ответы [ 3 ]

1 голос
/ 20 декабря 2011

У вас очень большое количество входных переменных (2000, если я понимаю ваше описание). Мое первое предложение - по возможности уменьшить это число. Некоторые возможные методы включают в себя: субсэмплирование входных переменных или вычисление информативных признаков (таких как общее количество строк и столбцов, которое уменьшит входной вектор до 90 = 40 + 50)

Кроме того, ваш вывод кодируется как 6 битов, что обеспечивает 32 возможных комбинированных значения, поэтому я предполагаю, что вы используете их для представления 26 букв? Если так, то вы можете лучше справиться с другим выходным представлением. Учтите, что различные буквы, которые не похожи друг на друга, будут, например, разделять значение 1 на бит 1, усложняя сопоставление входов и выходов. Выходное представление с 1 битом для каждого класса упростит вещи.

1 голос
/ 20 декабря 2011

вы можете попытаться добавить случайное упругое искажение к вашему тренировочному набору (чтобы расширить его и сделать его более «обобщаемым»).

Подробности этой замечательной статьи от Microsoft Research можно увидеть: http://research.microsoft.com/pubs/68920/icdar03.pdf

0 голосов
/ 21 декабря 2011

Вы можете использовать patternnet вместо newff, это создает сеть, более подходящую для распознавания образов. В качестве целевой функции используйте вектор из 26 элементов с 1 в позиции правой буквы (0 в другом месте). Результатом распознавания будет вектор из 26 действительных значений от 0 до 1, причем распознанная буква имеет наибольшее значение.

Обязательно используйте данные всех шрифтов для обучения.

Дайте в качестве входных данных все наборы данных, train автоматически разделит их на наборы для проверки достоверности поездов в соответствии с указанными процентами:

net.divideParam.trainRatio = .70;
net.divideParam.valRatio = .15;
net.divideParam.testRatio = .15;

(выберите свой процент).

Затем выполните тестирование, используя только набор тестов, вы можете найти их индексы в

[net, tr] = train(net,inputs,targets);
tr.testInd
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...