PaddleOCR
PaddleOCR copied to clipboard
关于config yml文件中的ratio_list
看FAQ关于ratio_list的解释是,使用多个数据源训练,在每个epoch按照ratio_list给出的比例对每个数据源采样,组成一个epoch训练。这样就能在训练的一个epoch中,保证覆盖到含有每个数据源的数据内容。
但是我看代码不是这样的,代码是在训练之前把每个数据源按照ratio_list的各自比例对每个数据集采样之后,组合成一个新的总数据集,之后在训练的一个epoch中,从这个新的总数据集取batch_size个数据进行训练,这样就不能保证每个epoch中覆盖到有每个数据源的数据。
如果要实现FAQ所说的方法,应该怎么修改代码呢?
一个epoch 指的是把所有训练数据丢进神经网络一次,你的总数据集覆盖每个数据源了,那每个epoch就覆盖每个数据源了吧
哦,我看错,那FAQ对代码的解释是对的。
我想实现的功能是这样的,在训练的每个iter也就是一次前向反向传播用到的batch_size的数据,按照比例从不同的数据源采样而来。
比如说batch_size是256,有两个数据源,ratio_list为0.1:0.9,那一个iter迭代中的batch_size256的数据中有10%采样来自于数据源1,而90%采样来自于数据源2。
这种需求主要是这种场景,比方说我之前用的总数据量有2千万来训练模型,后来发现模型对某一个场景类型数据识别不好,就增加了一些这种场景数据比如50万,这样我可以把新增加的数据加到原本的2千万总数据当中,但这样效果不是很明显,因为相对于总数据量来说新增数据比较少,也可以采用微调,但会影响原来对其他数据的识别效果,模型训练会遗忘见过次数很少的数据。
而采用我说的方法,这样在一个iter的迭代训练中,能够保证模型学习覆盖到每个数据源,这样对于要针对性优化识别不好场景,效果会不会好点。
官方能实现这种功能,或者怎么修改代码吗?
目前是epoch粒度的样本采样,每个epoch是可以保证覆盖到所以的场景的,你这种情况的话,需要修改下ppocr/data/simple_dataset.py的源码了哈
哦,我看错,那FAQ对代码的解释是对的。
我想实现的功能是这样的,在训练的每个iter也就是一次前向反向传播用到的batch_size的数据,按照比例从不同的数据源采样而来。
比如说batch_size是256,有两个数据源,ratio_list为0.1:0.9,那一个iter迭代中的batch_size256的数据中有10%采样来自于数据源1,而90%采样来自于数据源2。
这种需求主要是这种场景,比方说我之前用的总数据量有2千万来训练模型,后来发现模型对某一个场景类型数据识别不好,就增加了一些这种场景数据比如50万,这样我可以把新增加的数据加到原本的2千万总数据当中,但这样效果不是很明显,因为相对于总数据量来说新增数据比较少,也可以采用微调,但会影响原来对其他数据的识别效果,模型训练会遗忘见过次数很少的数据。
而采用我说的方法,这样在一个iter的迭代训练中,能够保证模型学习覆盖到每个数据源,这样对于要针对性优化识别不好场景,效果会不会好点。
官方能实现这种功能,或者怎么修改代码吗?
自己修改一下数据处理的源码,对两个数据集按比例动态采样组合成一个epoch,然后合并成一个新的list进行训练,训练的时候不使用shuffle就可以实现这种效果。