CNN + LSTM OCR模型不能正确预测“是”

时间:2018-05-14 07:33:49

标签: tensorflow deep-learning ocr lstm convolutional-neural-network

我在tensorflow中创建了一个模型,具有以下OCR结构。我在一个非常大的数据集(250K图像)上训练它,并且准确率达到94%左右。但该模型大多数时候预测“是”为“1”或“1S”。我检查了数据集,它包含了很多“是”的实例,所以我不认为数据集是问题所在。当模型是另一个单词的一部分,例如“this”或“christian”时,模型也会正确预测。可能是这种行为的原因是什么我如何改进模型以检测“是”。

我尝试过的事情

减少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 :(得分:1)

由于数据集中的大多数数字可能以空格开头,并且" 1"和"我"看起来很相似,这是一个可以理解的错误。

我没有改变网络架构的事情会有所帮助。

我要做的是人为地过采样"是"实例。你说它已经有很多例子 - 但可能还不够。因此,有一些概率为5% - 10%强制文本样本在包含"的位置是"。您甚至不需要重新开始整个培训,您可以继续培训这样一个已经训练过的网络,这将迫使网络偏向于"是"。

如果它现在开始误认为" 15" as"是"然后用一些较小的概率,比如2%-5%,添加包含这样的数字的延伸。因此,像教一个人一样,给它展示一些例子,让它能够了解它的不同之处。

但是,不要将概率提高得太高,因为你会破坏一般的准确性。它会很快学会从 15 ,但会忘记其他一切......

答案 1 :(得分:0)

您将需要一个语言模型来更正ocr输出中的拼写。我认为您可以在nltk中找到一个拼写检查器。可以使用seq2seq自动编码器构建更复杂的拼写检查器。