首页 Paddle框架 帖子详情
CRNN训练的时候Loss一直是0
收藏
快速回复
Paddle框架 问答深度学习模型训练 3790 26
CRNN训练的时候Loss一直是0
收藏
快速回复
Paddle框架 问答深度学习模型训练 3790 26

下面还有很多step,也都是0。。。

就是想问一下哪些原因会导致这种情况

0
收藏
回复
全部评论(26)
时间顺序
thinc
#2 回复于2020-11

百度出来的唯一一个原因是二分类把交叉熵用成了softmax

0
回复
AIStudio810258
#3 回复于2020-11

先大体定位下问题所在?

看看是数据部分,还是模型部分的问题,用paddlehub试试数据先~

0
回复
AIStudio810258
#4 回复于2020-11

我感觉每次没什么头绪的debug都是从大模块儿替换开始定位

0
回复
thinc
#5 回复于2020-11

一上来就是0,这谁顶得住啊

0
回复
thinc
#6 回复于2020-11
先大体定位下问题所在? 看看是数据部分,还是模型部分的问题,用paddlehub试试数据先~

咋试

0
回复
AIStudio810258
#7 回复于2020-11
thinc #5
一上来就是0,这谁顶得住啊

弟兄们,顶住!顶住!~~

0
回复
AIStudio810258
#8 回复于2020-11
thinc #6
咋试

就像修电脑,替换法

0
回复
AIStudio810258
#9 回复于2020-11

模型是现成的,换别的数据集试试,先看看是不是数据集处理的原因

0
回复
thinc
#10 回复于2020-11

找到原因了!果然是ctc_loss函数计算出问题

ctc_loss函数里头有个参数叫做 label_lengths ,这是用来标识label中每个序列的长度,之所以说 每个,是因为这个参数的shape是 [batch_size]。

因为CRNN里头的训练标签是不定长的,而定义占位符InputSpec的时候需要指定shape。有两种办法可以实现,一个是把所有标签padding到最长的标签,一个是用LoDTensor。然而LoDTensor在2.0rc里面没找到相关使用方法介绍,就用的padding,于是乎在ctc_loss函数里把label_lengths都写成了最长标签的值。

解决办法也很简单,重新写一个list统计每个label的长度,然后用这个list作为参数label_lengths。

至于为什么会得到0,这个还得研究研究......

1
回复
thinc
#11 回复于2020-11
模型是现成的,换别的数据集试试,先看看是不是数据集处理的原因

确实是数据处理的问题,我想一般的错误也都是出现在这里

0
回复
thinc
#12 回复于2020-11
模型是现成的,换别的数据集试试,先看看是不是数据集处理的原因

但是这个谁又能想到呢。。。看来光学理论知识是不够的,工程能力也得跟上

0
回复
AIStudio810258
#13 回复于2020-11
thinc #10
找到原因了!果然是ctc_loss函数计算出问题 ctc_loss函数里头有个参数叫做 label_lengths ,这是用来标识label中每个序列的长度,之所以说 每个,是因为这个参数的shape是 [batch_size]。 因为CRNN里头的训练标签是不定长的,而定义占位符InputSpec的时候需要指定shape。有两种办法可以实现,一个是把所有标签padding到最长的标签,一个是用LoDTensor。然而LoDTensor在2.0rc里面没找到相关使用方法介绍,就用的padding,于是乎在ctc_loss函数里把label_lengths都写成了最长标签的值。 解决办法也很简单,重新写一个list统计每个label的长度,然后用这个list作为参数label_lengths。 至于为什么会得到0,这个还得研究研究......
展开

不是说不定长的序列可以补0处理么?

0
回复
thinc
#14 回复于2020-11
不是说不定长的序列可以补0处理么?

对,ctc_loss有很多参数,其中label_lengths需要说明每个label的长度,虽然每个label都paddign到90,但填充的不能作为label_len参与计算

0
回复
AIStudio810258
#15 回复于2020-11
thinc #14
对,ctc_loss有很多参数,其中label_lengths需要说明每个label的长度,虽然每个label都paddign到90,但填充的不能作为label_len参与计算

恭喜又出一坑~~

0
回复
水水水的老师
#16 回复于2020-11
thinc #10
找到原因了!果然是ctc_loss函数计算出问题 ctc_loss函数里头有个参数叫做 label_lengths ,这是用来标识label中每个序列的长度,之所以说 每个,是因为这个参数的shape是 [batch_size]。 因为CRNN里头的训练标签是不定长的,而定义占位符InputSpec的时候需要指定shape。有两种办法可以实现,一个是把所有标签padding到最长的标签,一个是用LoDTensor。然而LoDTensor在2.0rc里面没找到相关使用方法介绍,就用的padding,于是乎在ctc_loss函数里把label_lengths都写成了最长标签的值。 解决办法也很简单,重新写一个list统计每个label的长度,然后用这个list作为参数label_lengths。 至于为什么会得到0,这个还得研究研究......
展开

CRNN就容易出现梯度消失

0
回复
thinc
#17 回复于2020-11
CRNN就容易出现梯度消失

这也不算是梯度消失吧,毕竟都有正则“强制”拉回数据

0
回复
水水水的老师
#18 回复于2020-11
thinc #17
这也不算是梯度消失吧,毕竟都有正则“强制”拉回数据

有时候正则也拉不回来

0
回复
screamdw
#19 回复于2020-11

恭喜又出一坑~~

0
回复
thinc
#20 回复于2020-11

不过新的问题,训练集的loss下不去。。。从第一个epoch就卡在7附近。。

大佬们,99孩子吧

0
回复
AIStudio810258
#21 回复于2020-11
thinc #20
不过新的问题,训练集的loss下不去。。。从第一个epoch就卡在7附近。。 大佬们,99孩子吧

不行用“麻雀”先跑下吧~~

0
回复
需求/bug反馈?一键提issue告诉我们
发现bug?如果您知道修复办法,欢迎提pr直接参与建设飞桨~
在@后输入用户全名并按空格结束,可艾特全站任一用户