使 Keras 的 CTC 损失适用于大小差异很大的输入

Making Keras' CTC Loss work for Input with vastly different sizes

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

此图像沿 y 轴拉伸以获得更好的可见性,但 NN 的输入是 1d。我正在寻找一种翻译图像内容的聪明方法,在这个例子中正确的翻译是“WPM = TEXT I”。我当前的模型在 this 教程中使用 keras 的 ctc 损失。然而,它会为每个时间步长检测字母“E”(“E”是“.”的摩尔斯等价物或图像中的一个小条),所以我认为“stepsize”太小了。另一次尝试将超过某个阈值的每个时间步分类为“E”,其他所有内容都为 [UNK]/空白。

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

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

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

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

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

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

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

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

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