-
Notifications
You must be signed in to change notification settings - Fork 109
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
不定长的识别问题 #8
Comments
@Hubert2102 |
改标注指的是不定长文字训练嘛@chenjun2hao |
@chenjun2hao 我尝试了不定长训练,包括几种方式: |
这个是不定长训练可以解决的么?我看ctc解码是定长训练可以不定长预测来着 |
请问你是pad了图片还是文字还是两者呢?不定长那么图片的大小也会不一样吧 |
@Lanme ,针对不定长的文本,你需要:1. 在batch内将图片统一宽度或者整个数据集用同样的宽度。2. 为了batch训练,你需要将标注的label填充为统一的长度(用blank进行填充)。 |
那这确定是不定长训练能解决么? 我定长训练了,之后我输入的图片也是这么多字符,但是图片被拉长了,字符间距变大,resize成固定高度,这个时候宽度和原来训练的不一样,就识别不出来了。 |
@Lanme 训练时输入图像分桶,保证同一个batch内的长度一样就可以 |
你试过这样不定长训练就能解决不定长预测的问题么? |
@Lanme 可以,我尺度用的range(64,4,516),超过512缩放到512,低于64的缩放到64,效果和训练几个定长模型差不多 |
@zuokai 将图像缩放到统一高度,长度不够的话进行padding; 这样做进行不定长训练可否? 我的想法是这样就不用对数据分桶了; 另外请问你数据分桶用的什么函数? |
@wenston2006考虑到训练耗时,我没有加pad啊,你可以试试,我觉得应该是可以的,不过这样你要把sequence_length传给dynamic_rnn,分桶我就是随机random.choice(range(64,516,4)) |
@zuokai 了解了,我以为用的pytorch自带的bucket函数; 你训练不定长图片,最后在测试集上识别精度如何? |
@wenston2006 精度和训练多个定长的attention模型几乎一样,具体和你测试集难度有关 |
@zuokai tensorflow因为用的静态图, 对于不定长的训练数据, 由于相应的RNN的参数也会改变, 导致需要构建多个静态图, 所以推出了dynamic_rnn; pytorch本身就是构建的动态图,应该没有dynamic_rnn这个函数吧?我现在用的这个git里面的第二版本, 作者对每个batch求得最长的文本长度max_length, 然后构建图时图的长度就是max_length, batch里面长度较短的文本,会填充若干个blank字符进行对齐. 不知道他的做法是否跟你前面讲的思路一致? |
@zuokai 我梳理了一下,本git第二版图片的长度统一resize到高32, 长280, 对于文本标签也进行了对齐; 根据你前面讲的,你是将图片分桶, 我的理解是不改变原图的宽和高的比例, 但将高度统一缩放到某个固定高度(如32?), 然后不断从训练数据中抽取相同宽度的图片,直到获得batch_size张图片,然后进行训练; 我现在还有三点存疑: 1)请问你对文本标签怎么处理的,是否进行了对齐呢?同时确保图片尺寸和文本标签长度一致似乎较难; 2)分桶以后要针对每种图片宽度构建一个模型吗?;3)在2)的基础上, loss也要针对每种模型进行计算,最终将不同模型的loss累加起来? |
@wenston2006 是一个模型啊,cnn和dynamic_rnn本来就支持动态大小的图片,只是因为需要batch训练,才通过分桶保证图像在一个batch内宽度是一样的,但是文本长度是不一样的,用补齐就行了 |
@zuokai 我现在也尝试了bucket的思路,不过我是根据训练文本长度来区分的, 训练的loss很低,但在测试集上loss很高, 训练出来的模型泛化性能不强, 应该是过拟合了; 把训练数据用来测试都是对的,换成别的数据,就不行了,对测试文本长度也比较敏感 |
@kellylin841015 请问你的训练和测试代码可以分享一下吗? 你上面提到训练都用的10个字,那么cnn阶段不定长是指的训练还是测试? |
你好,請問,blank填充是指你的字典裡有一個字符是" "空格嗎?還是你以其他字符代表? |
你好,用您提供的开源模型进行不定长测试,有这两种问题:
1.图片不定长:
transformer = dataset.resizeNormalize((280, 32)),非280会报错,CRNN的处理是按照32的高然后同比例缩放图片的宽,因此输入是(x,32)
2.文字不定长:
可能是因为训练的时候都是10个字,预测的时候不管图片里面几个字,预测结果还都是10个字左右?
举个例子,把图片
中的字去掉几个后,还是280*32输入识别,
结果是这样:
predict_str:,__不愿意意意资(9个字) => prob:0.002346405293792486
predict_str:中国通信信位主办、《 (10个字) => prob:0.05960559844970703
predict_str:,(通信学会主主府 (9个字) => prob:0.000349084148183465
predict_str:叶国通信学会主里”《 (10个字) => prob:0.01799328438937664
想问如何解决?是不是训练需要不定长训练啊?谢谢~
The text was updated successfully, but these errors were encountered: