PaddleOCR icon indicating copy to clipboard operation
PaddleOCR copied to clipboard

关于config yml文件中的ratio_list

Open ziyaxuanyi opened this issue 1 year ago • 4 comments

看FAQ关于ratio_list的解释是,使用多个数据源训练,在每个epoch按照ratio_list给出的比例对每个数据源采样,组成一个epoch训练。这样就能在训练的一个epoch中,保证覆盖到含有每个数据源的数据内容。

但是我看代码不是这样的,代码是在训练之前把每个数据源按照ratio_list的各自比例对每个数据集采样之后,组合成一个新的总数据集,之后在训练的一个epoch中,从这个新的总数据集取batch_size个数据进行训练,这样就不能保证每个epoch中覆盖到有每个数据源的数据。

如果要实现FAQ所说的方法,应该怎么修改代码呢?

ziyaxuanyi avatar Aug 31 '22 01:08 ziyaxuanyi

一个epoch 指的是把所有训练数据丢进神经网络一次,你的总数据集覆盖每个数据源了,那每个epoch就覆盖每个数据源了吧

XiaokangLei avatar Aug 31 '22 01:08 XiaokangLei

哦,我看错,那FAQ对代码的解释是对的。

我想实现的功能是这样的,在训练的每个iter也就是一次前向反向传播用到的batch_size的数据,按照比例从不同的数据源采样而来。

比如说batch_size是256,有两个数据源,ratio_list为0.1:0.9,那一个iter迭代中的batch_size256的数据中有10%采样来自于数据源1,而90%采样来自于数据源2。

这种需求主要是这种场景,比方说我之前用的总数据量有2千万来训练模型,后来发现模型对某一个场景类型数据识别不好,就增加了一些这种场景数据比如50万,这样我可以把新增加的数据加到原本的2千万总数据当中,但这样效果不是很明显,因为相对于总数据量来说新增数据比较少,也可以采用微调,但会影响原来对其他数据的识别效果,模型训练会遗忘见过次数很少的数据。

而采用我说的方法,这样在一个iter的迭代训练中,能够保证模型学习覆盖到每个数据源,这样对于要针对性优化识别不好场景,效果会不会好点。

官方能实现这种功能,或者怎么修改代码吗?

ziyaxuanyi avatar Aug 31 '22 02:08 ziyaxuanyi

目前是epoch粒度的样本采样,每个epoch是可以保证覆盖到所以的场景的,你这种情况的话,需要修改下ppocr/data/simple_dataset.py的源码了哈

littletomatodonkey avatar Aug 31 '22 05:08 littletomatodonkey

哦,我看错,那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就可以实现这种效果。

QQQTAO avatar Sep 21 '22 08:09 QQQTAO