ctc_loss_calculator.cc:144] No valid path found.或loss: inf

最近经常出现一个错误,在模型训练的时候loss:inf,如果出现的不多的话还是可以接受的,但是一旦这个大量出现,模型就不能训练了,损失也很难收敛,所以今天我终于把这个问题解决了,写下来表示分享。
经过分析,是输入长度和标签长度之间的问题,网上说要求输入长度要大于标签长度,我看了一下我的输入长度13,标签长度10,符合要求,但是依然出现错误,我换了一个模型之后输入长度14,标签长度10,问题消失,得出结论,输入长度要高于标签长度一部分,至于高出多少,应该考虑识别的字符串中重复并且相邻的字符数,简单来说就是尽量的多一些吧,目前没有分析增加输入长度对性能的影响,至少肉眼感觉不出来,但是影响性能是肯定的。
下面说怎么增加输入长度,我们知道用CTCloss的时候需要有四个输入,分别如下:
在这里插入图片描述
后两个参数就是输入长度和标签长度,标签长度肯定是没法改的,这个需求是固定的,所以只能改input_length,后来我发现input_length是和网络结构相关的,如图:
在这里插入图片描述
可以看到,基础网络传入CTC中的尺寸是(15,37),这个15和我们的input_length就有关系了,我这里input_length=15-2(我也没搞懂为啥减2),37代表的是我识别的36个字符和一个空格,这个时候我只需要增加15这个数就好了,所以我在前边增加了一个Reshape层,如图:
在这里插入图片描述
经过Reshape之后变成了30,这样我们再看CTCloss部分:
在这里插入图片描述
这里的输入尺寸变成了(30,37),input_length变成了28,label依然是10,错误没有了,又可以浪了。

发布了33 篇原创文章 · 获赞 21 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_39226755/article/details/100834206