微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使 Keras 的 CTC 损失适用于大小不同的输入

如何解决使 Keras 的 CTC 损失适用于大小不同的输入

所以我试图将莫尔斯码信号转换为它们的字符串表示。某些形式的预处理从 [0,1] 产生归一化浮点数的一维数组,用作 C/RNN 的输入。示例:

barcode

该图像沿 y 轴拉伸以获得更好的可见性,但 NN 的输入是 1d。我正在寻找一种聪明的方式来翻译图像的内容在这个例子中,正确的翻译是“WPM = TEXT I”。我当前的模型使用 keras 的 ctc 损失,如 this 教程中所述。然而,它会检测每个时间步长的字母“E”(“E”是莫尔斯等效的“.”或图像中的一个小条),所以我认为“步长”太小了。另一种尝试强化了这一点,该尝试将高于某个阈值的每个时间步归类为“E”,而其他所有内容均归类为 [UNK]/blank。

我认为主要问题是例如“E”(一条细线)和其他字符之间的巨大差异,例如“=”,由小线表示,由两条粗线框起,如图中间 (-...-)。这在语音识别中应该不是什么问题,因为在那里你可以让时间段的语音感觉小到微秒(比如在“thin”和“gym”中听到“i”的声音),这在这种情况下是不可能的.

也许有人想出了一个聪明的解决方案,要么是针对这个实现,要么是通过不同的输入表示或类似的东西。

解决方法

我还成功地使用 CTC-loss 从交通标志牌中提取文本信息。

直觉上,除非你有很多例子,以便 CNN(编码器)可以提取并实际学习到不同大小实际上可以指向同一个字母,否则你将无法成功学习这一点。

确实,CTC 的理论基础确实意味着损失函数能够学习不同的大小,但在您的特定情况下,(较粗的)线也可以很容易地归类为相同的前一个字母(较细的)。

>

我会采用的一种可能尝试是减少您正在处理的单词的时间步长/最大长度。直观地说,这将(假设我们保持图像的相同宽度)为 RNN 强制执行更大的分类框架。在您的特定情况下,这可能被证明是一种有用的方法,因为您对您的网络解释更广泛区域的能力感兴趣(不像教程中的 CAPTCHA 示例)。

所以在下图中,bin 的宽度会更宽,因此可以更好地掌握(粉红色矩形的宽度会更大)。

另一个需要考虑的重要方面是数据集的维度。确保你使用了增强并且你有足够的训练样本。我在 CTC 上也说过,要获得成功的结果,您还需要分析各种文本(不仅是样本编号,还包括样本中的文本)。在这里,数据量起着更大的作用;网络更容易区分 A 和 X,但更难区分粗线和细线。

https://towardsdatascience.com/intuitively-understanding-connectionist-temporal-classification-3797e43a86c

图片来源:https://towardsdatascience.com/intuitively-understanding-connectionist-temporal-classification-3797e43a86c

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。