shawnh2 / BankCard-Recognizer

Identifying numbers from bankcard, based on Deep Learning with Keras
MIT License
80 stars 31 forks source link

修改batch size #2

Open xxxxxxxiao opened 4 years ago

xxxxxxxiao commented 4 years ago

你好! 我想请问下为什么修改batch size之后报tensorflow.python.framework.errors_impl.InvalidArgumentError: Not enough time for target transition sequence (required: 4, available: 3)1You can turn this error into a warning by using the flag ignore_longer_outputs_than_inputs 这个错误? 谢谢

shawnh2 commented 4 years ago

原因是标签(Label)的长度比序列(Sequence)长度要大了。可以在报错函数中设置参数 ignore_longer_outputs_than_inputs=True, 之后这类数据的损失会自动返回0,报错也就消失了。你是在训练哪个模型的时候遇到的错误?CRNN还是EAST?

xxxxxxxiao commented 4 years ago

CRNN。 这样做的话会不会影响梯度下降呢?

shawnh2 commented 4 years ago

影响不大

xxxxxxxiao commented 4 years ago

貌似找到原因了。 val_gen = DataGenerator(val_list, img_size, down_sample_factor, batch_size, max_label_length) crnn_blstm_ctc.py中这一行的down_sample_factor, batch_size这两个参数位置颠倒了。。

shawnh2 commented 4 years ago

好的,找的问题就好

xxxxxxxiao commented 4 years ago

能否问下你最后loss大概是多少?我改batchsize=64训练后测试集loss大概在0.77,但是demo输出的结果都是‘00’或者‘40’这种。不知是哪里操作不对?

xxxxxxxiao commented 4 years ago

我把你训练的模型加载后再训练,一开始出来的loss很高,请问有没有可能是loss的计算方式有问题?

shawnh2 commented 4 years ago

损失函数应该不存在问题,降低batch_size试试。

xxxxxxxiao commented 4 years ago

验证集降到16,应该是跟你训练的时候一样啊。。不知道为什么val loss还是那么高。。。

gitTaner commented 4 years ago

你好,我用楼主的训练集,进行rcnn模型训练,没改训练参数,直接进行训练,val_loss一直上升,训练到20个epochs左右的时候val_loss还是30左右val_acc接近于0,请问可能哪里出了问题? 楼主训练的rcnn用的参数是最新更新的版本吗?batch_size, aug_num等用的是什么值呢? 希望楼主不吝赐教

shawnh2 commented 4 years ago

参数还是源码中的没有更改。你可能训练的数据集不对,请确保是卡号的数据集而不是银行卡的。

gitTaner commented 4 years ago

我使用的平台的Windows,,使用的数据集是楼主银行卡号的数据集,下面是第15个epochs训练完的记录。我是加载楼主的模型继续训练的,aug_number=5,我想测试下楼主模型的在验证集的准确率,结果也是0。在compile 的时候添加了metrics=['accuracy']. 想问下楼主的val_loss训练的时候能达到多少?

281/281 [==================] - 128 455ms/step -loss:0.8534 -acc:0.5514 - val_loss:43.6632 - val_acc:0.0000e+00

shawnh2 commented 4 years ago

多谢反馈,crnn部分代码已做更新,参照readme的crnn训练方法训练即可

gitTaner commented 4 years ago

多谢反馈,crnn部分代码已做更新,参照readme的crnn训练方法训练即可

1 新版本代码跟预训练模型不匹配,模型没有更新,要运行demo需要把cfg中的numclass 改为10才行 2 训练代码跑了一晚上,增强系数30,到38个epochs,loss 18左右,val_loss貌似还是不降,30几,然后val_acc一直为0

shawnh2 commented 4 years ago

多谢反馈,crnn部分代码已做更新,参照readme的crnn训练方法训练即可

1 新版本代码跟预训练模型不匹配,模型没有更新,要运行demo需要把cfg中的numclass 改为10才行 2 训练代码跑了一晚上,增强系数30,到38个epochs,loss 18左右,val_loss貌似还是不降,30几,然后val_acc一直为0

反馈问题已提交commit,更新代码。

  1. 新版本模型比原来的新增了空格识别,也就是NUM_CLASSES+1了.
  2. 新版本模型不要在原来模型基础上训练,可尝试从头训练或在README crnn部分下载预训练网络
  3. 新版本模型可以尝试增大aug_nbr、降低batch_size、增大验证集(validation_ratio)来提升训练性能
gitTaner commented 4 years ago

新版本的val_loss训练过程中正常了,与loss趋势基本一致,但是我有几个疑问还请楼主帮我解惑一下 1 老版本的numclass 没有+1,类别为11,那模型是如何识别空格呢与结束符的呢? 2 新版的空格''用10填充,未满26位的字符也用10 append,由于我训练还没结束,猜测到时预测出来的结果会是形如eg 【1233_1511_2189_8745___】吗? 3 老版本的val_loss不下降是因为没有加1导致的吗? 问题实在有点多,我好疑惑啊,o(╯□╰)o,如果大神能帮忙解答一下太棒了

shawnh2 commented 4 years ago
  1. 老版本并不能识别卡号中的空格(也就是_),在预处理部分将它去除掉了,所以num_classes=10+1 并没有问题,而新版支持,故为12
  2. 不会出现末尾未满26位填充_ 的情况,数字中间有空白区域会。你可以拿预训练网络实验一下,除了最后几位因训练不足因素没有识别出,其它表现还算乐观
  3. 老版的模型本身并没有太大问题,而是我在数据预处理时的失误。也感谢你问题的提出。