CNN+LSTM OCR 模型无法正确预测“是”
Posted
技术标签:
【中文标题】CNN+LSTM OCR 模型无法正确预测“是”【英文标题】:CNN+LSTM OCR model not predicting "is" correctly 【发布时间】:2018-10-23 19:23:52 【问题描述】:我在 tensorflow 中制作了一个模型,其 OCR 结构如下。我在一个非常大的数据集(250K 图像)上对其进行了训练,并且准确率也达到了 94% 左右。但该模型在大多数情况下将“is”预测为“1s”或“1S”。我检查了数据集,它包含很多“is”实例,所以我不认为数据集是问题所在。当它是另一个词(例如“this”或“christian”)的一部分时,该模型也能正确预测。这种行为可能是什么原因我如何改进模型以检测“是”。
我尝试过的事情
减少 maxpool 层数。
对 maxpool 层使用 2x1 内核
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]
【问题讨论】:
【参考方案1】:由于您的数据集中的大多数数字可能都以空格开头,并且“1”和“i”看起来相似,因此这是一个可以理解的错误。
我不认为改变网络架构会有所帮助。
我要做的是人为地oversample“is”实例。你说已经有很多例子了——但可能还不够。因此,以 5% - 10% 的概率强制文本样本位于包含“is”的位置。你甚至不需要重新开始整个训练,你可以像这样继续训练一个已经训练好的网络,它会迫使网络偏向“是”。
如果它现在开始将“15”误认为“是”,那么以较小的概率(例如 2%-5%)添加包含类似数字的片段。所以就像教一个人一样,给它展示一些例子,让它了解不同之处。
不过,不要将概率提高得太高,因为这样会破坏总体准确性。它会很快学会区分 15 和 is,但会忘记其他一切......
【讨论】:
【参考方案2】:您将需要一个语言模型来纠正 ocr 输出中的拼写。我认为您可以在 nltk 中找到一个拼写检查器。可以使用 seq2seq 自动编码器构建更复杂的拼写检查器。
【讨论】:
以上是关于CNN+LSTM OCR 模型无法正确预测“是”的主要内容,如果未能解决你的问题,请参考以下文章
PyTorch搭建CNN-LSTM混合模型实现多变量多步长时间序列预测(负荷预测)
是否有一些用于时间序列预测的预训练 LSTM、RNN 或 ANN 模型?
DL之LSTM/GRU/CNN:基于tensorflow框架分别利用LSTM/GRUCNN算法对上海最高气温实现回归预测案例