Почему мой feed-forward network не улучшает свой MSE выше определённого значения во время обучения для задачи OCR?
Краткое содержание
Я провожу эксперименты с нейронными сетями и для этого пытаюсь запрограммировать простую задачу OCR. Я знаю, что CNN — лучший выбор, но на данном этапе и из-за отсутствия опыта я хочу идти шаг за шагом и начать с прямых сетей. Итак, мои обучающие данные — это набор примерно из 400 изображений размером 16×16, извлечённых из скрипта, который рисует каждый символ алфавита на маленьком изображении для небольшого набора шрифтов, зарегистрированных на моём компьютере. Затем тестовый набор данных извлекается по той же процедуре, но для всех шрифтов на моём компьютере. Что ж, результаты довольно плохие. Точность составляет примерно 45–50 %, что очень слабо... но это не мой вопрос. Дело в том, что я не могу снизить MSE ниже 0,0049, какое бы распределение скрытых слоёв я ни применял к сети. Я пробовал несколько архитектур, и всё сводится к этой цифре. Означает ли это, что сеть не может учиться дальше, учитывая данные? Однако это значение MSE даёт и такие плохие результаты. Я использую API TensorFlow напрямую, без keras или estimators.
Полный текст
Спрошено 6 лет, 10 месяцев назад Изменено сегодня Просмотрено 193 раза
Спрошено 6 лет, 10 месяцев назад
4 $\begingroup$ Я провожу эксперименты с нейронными сетями и для этого пытаюсь написать простую задачу OCR. Я знаю, что CNN — лучший выбор, но на данный момент и из-за моей неопытности я хочу идти шаг за шагом и начать с feedforward nets. Итак, мои обучающие данные — это набор примерно из 400 изображений 16*16, извлеченных из скрипта, который рисует каждый алфавитный символ в маленьком изображении для небольшого набора шрифтов, зарегистрированных на моем компьютере. Затем тестовый набор данных извлекается из той же процедуры, но для всех шрифтов на моем компьютере. Что ж, результаты довольно плохие. Получаю точность примерно 45-50%, что очень плохо... но это не мой вопрос. Дело в том, что я не могу получить MSE ниже 0,0049, какое бы распределение скрытых слоев я ни применял к сети. Я пробовал несколько архитектур, и всё сводится к этой цифре. Означает ли это, что сеть не может учиться дальше, учитывая данные? Однако это значение MSE дает и такие плохие результаты. Я использую Tensorflow API напрямую, без keras или estimators, и для списка из 62 распознаваемых символов вот примеры архитектур, которые я использовал: [256,1860,62] [256,130,62] [256,256, 128 ,62] [256,3600,62] .... Но никогда не получал MSE ниже 0,0049, и всё равно результаты не превышают 50%. Любые подсказки будут очень кстати. feedforward-neural-networks optical-character-recognition mean-squared-error Поделиться Улучшить этот вопрос Следить Изменено 1 час назад Mr. AI Cool 1,107 1 1 серебряный бейдж 19 19 бронзовых бейджей Спрошено 4 мар 2019 в 21:13 Chal.lo 61 1 1 бронзовый бейдж $\endgroup$ 5 $\begingroup$ на самом деле дело не только в архитектуре, как насчет значения скорости обучения? вы пробовали ее настраивать? как насчет количества ваших обучающих эпох? $\endgroup$ malioboro – malioboro 2019-03-04 22:23:52 +00:00 Прокомментировано 4 мар 2019 в 22:23 $\begingroup$ 400 обучающих примеров — это довольно маленькое число, я думаю, для решения этой задачи. Вам понадобятся тысячи картинок, чтобы достичь хороших результатов, полагаю. $\endgroup$ nbro – nbro 2019-03-05 10:04:51 +00:00 Прокомментировано 5 мар 2019 в 10:04 $\begingroup$ Сколько у вас категорий? 26? $\endgroup$ user9947 – user9947 2019-03-05 10:33:21 +00:00 Прокомментировано 5 мар 2019 в 10:33 $\begingroup$ Нет, 62. Выход сети — это one-hot массив, каждая позиция соответствует различному символу для распознавания $\endgroup$ Chal.lo – Chal.lo 2019-03-06 07:44:19 +00:00 Прокомментировано 6 мар 2019 в 7:44 $\begingroup$ Я бы порекомендовал использовать более крупный набор данных. Наборы данных MNIST или EMNIST отлично подходят для обучения OCR. Также, сколько поколений вы обучаете вашу сеть. $\endgroup$ Sean Mabli – Sean Mabli 2021-03-24 17:18:35 +00:00 Прокомментировано 24 мар 2021 в 17:18 Добавить комментарий | 1 Ответ 1 Сортировка по: Сбросить к значению по умолчанию Наибольший балл (по умолчанию) Дата изменения (сначала новые) Дата создания (сначала старые) 0 $\begingroup$ Итак, обучающие данные — это небольшое количество примеров (400), взятых из небольшого набора шрифтов, а тестовые данные — это гораздо более крупный набор данных, взятый из гораздо большего набора шрифтов и, следовательно, гораздо более изменчивый, чем обучающие данные. Два вопроса здесь — это небольшой размер обучающих данных и разница в распределениях между обучающими и тестовыми данными. Я бы попробовал следующее: Вместо определения собственной архитектуры попробуйте некоторые из предварительно обученных архитектур, доступных в Keras, таких как ResNet50 или VGG16. Вы можете запустить их либо со случайными весами, либо с весами imagenet. Удалите верхний слой и добавьте свои собственные слои. Вы также можете выборочно разморозить слои и посмотреть, будет ли какая-либо разница. Чтобы справиться с проблемами, которые я упомянул выше, используйте аугментацию данных для внесения изменчивости в обучающий набор. Вы также не упомянули в посте, как вы решаете прекратить обучение сети. В случае, если сеть переобучается, вы