Модель оптического распознавания символов CNN + LSTM не предсказывает правильно "есть" - PullRequest
0 голосов
/ 14 мая 2018

Я сделал модель в тензорном потоке со следующей структурой для OCR. Я обучил его на значительно большом наборе данных (250K изображений), а также получил точность около 94%. Но модель предсказывает "is" как "1s" или "1S" в большинстве случаев. Я проверил набор данных, и он содержит довольно много экземпляров «is», поэтому я не думаю, что набор данных - это проблема. Также модель правильно предсказывает, когда она является частью другого слова, такого как «это» или «христианин». Что может быть причиной такого поведения, как я могу улучшить модель, чтобы обнаружить «есть».

То, что я пробовал

Уменьшить количество слоев maxpool.

Используйте 2x1 ядра для слоев maxpool

Input: (?, 64, 1024, 1)
cnn-1: [None, 64, 1024, 64]
relu-1: [None, 64, 1024, 64]
bn-1: [None, 64, 1024, 64]
maxpool-1: [None, 32, 512, 64]
cnn-2: [None, 32, 512, 128]
relu-2: [None, 32, 512, 128]
bn-2: [None, 32, 512, 128]
maxpool-2: [None, 16, 256, 128]
cnn-3-1: [None, 16, 256, 256]
relu-3-1: [None, 16, 256, 256]
cnn-3-1: [None, 16, 256, 256]
relu-3: [None, 16, 256, 256]
bn-3: [None, 16, 256, 256]
maxpool-3: [None, 8, 128, 256]
cnn-4-1: [None, 8, 128, 512]
relu-4-1: [None, 8, 128, 512]
bn-4-1: [None, 8, 128, 512]
cnn-4-2: [None, 8, 128, 512]
relu-4-2: [None, 8, 128, 512]
bn-4-2: [None, 8, 128, 512]
maxpool-4: [None, 4, 64, 512]
cnn-5: [None, 4, 64, 512]
relu-5: [None, 4, 64, 512]
lstm-input: [None, 64, 2048]
lstm-output: [None, 64, 256]
lstm-output-reshaped: [None, 256]
fully-connected: [None, 94]
reshaped_logits: [None, None, 94]
transposed_logits: [None, None, 94]

Ответы [ 2 ]

0 голосов
/ 09 декабря 2018

Вам понадобится модель языка для исправления орфографии в ocr output. Я думаю, что вы можете найти одну проверку орфографии в NLTK. Более сложные средства проверки правописания могут быть созданы с использованием автокодеров seq2seq.

0 голосов
/ 14 мая 2018

Поскольку, вероятно, большинству чисел в вашем наборе данных предшествуют пробелы, а "1" и "i" выглядят одинаково, это несколько понятная ошибка.

Я не думаю, что меняю архитектуру сетипоможет вообще.

Что бы я сделал, это искусственно передискретизация экземпляров "is".Вы говорите, что уже есть много примеров этого - но, вероятно, недостаточно.Таким образом, с некоторой вероятностью 5% - 10% принудительно введите образец текста в место, которое будет содержать «есть».Вам даже не нужно перезапускать всю тренировку, вы можете продолжить тренировку уже обученной сети, подобной этой, и это заставит сеть смещаться в сторону «есть».

Если теперь она начинает ошибочно идентифицировать »15 "как" есть ", то с некоторой меньшей вероятностью, например, 2% -5%, добавьте отрезки, которые также содержат такие числа.Поэтому, подобно обучению человека, покажите ему примеры, чтобы он смог понять разницу.

Не повышайте, однако, слишком высокие вероятности, потому что вы нарушите общую точность.Он очень быстро научится отличать 15 от , но забудет все остальное ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...