我在tensorflow中为OCR制作了一个模型,其结构如下。我在一个非常大的数据集(250 K图像)上对它进行了训练,并且获得了94%的准确率。但该模型预测大多数情况下"is“为"1s”或"1S“。我检查了数据集,它包含了相当多的" is“实例,所以我认为dataset不是问题所在。此外,当它是另一个词的一部分时,如"this“或"christian”,该模型也能正确地预测。这种行为的原因可能是什么?我如何改进"is“这个模型。
Things我试过
减少最大池层的数量。
使用最大池层的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]发布于 2018-05-14 12:36:12
由于数据集中的大多数数字前面都是空格,"1“和"i”看起来很相似,这是一个可以理解的错误。
我不认为改变网络的架构会有帮助。
我要做的是人为地对" is“实例进行过采样。你说已经有很多这样的例子了--但可能还不够。因此,在一些概率为5% - 10%的情况下,文本样本将位于包含"is“的位置。你甚至不需要重新开始整个训练,你可以继续训练一个已经训练过的网络,这将迫使网络偏向"is“。
如果它现在开始错误地将"15“识别为"is”,那么以更小的概率,比如2%-5%,添加包含类似数字的拉伸。所以,就像教一个人,给它举个例子,让它了解不同之处。
不过,不要把概率提高得太高,因为你会破坏一般的准确性。它会很快学会分辨出15和is,但它会忘记一切.
发布于 2018-12-09 10:53:57
您将需要一个语言模型来纠正ocr输出中的拼写。我想你可以在nltk找到一个拼写检查器。可以使用seq2seq自动编码器构建更复杂的拼写检查器。
https://stackoverflow.com/questions/50325142
复制相似问题