在训练和测试的时候遇到的问题,
_error_if_any_worker_fails()
RuntimeError: DataLoader worker (pid 25637) is killed by signal: Killed.
以及,
RuntimeError: $ Torch: not enough memory: you tried to allocate
经过研究,修改batch_size参数就不报错了。将batch_size改小一点,甚至是1都可以。
(PS:也许是我电脑真的不行,改成1了还是跑不动,准备申请一台好一点的电脑)
batch size 参数
批尺寸Batch_Size为每次训练样本个数;
迭代次数=样本总数/批尺寸;
https://www.zhihu.com/question/32673260
在合理范围内,增大 Batch_Size 有何好处?
- 内存利用率提高了,大矩阵乘法的并行化效率提高
- 跑完一次epoch(全数据集)所需要的迭代次数减小,对于相同数据量的处理速度进一步加快
- 在一定范围内,一般来说batch size越大,其确定的下降方向越准,引起的训练震荡越小
盲目增大batch size 有什么坏处
- 内存利用率提高了,但是内存容量可能撑不住了
- 跑完一次epoch(全数据集)所需要的迭代次数减少,但是想要达到相同的精度,其所花费的时间大大增加了,从而对参数的修正也就显得更加缓慢
- batch size 大到一定的程度,其确定的下降方向已经基本不再变化
fine tuning
fine tuning 流程
- 准备数据集(包括训练数据和测试数据)
- 计算数据集的均值文件,因为某个特定领域的图像均值文件会跟ImageNet上的数据均值不太一样
- 修改网络最后一层的输出类别数,以及最后一层网络的名称,加大最后一层的参数学习速率
- 调整solver的配置参数
- 加载预训练模型的参数,启动训练
fine tuning 参数调整
一般fine tuning的方式,都是把learning rate(solver.prototxt)调低(为原来的十分之一),之后把训练模型的最后一层或者两层的学习速率调大一点————这就相当于,把模型的前面那些层的学习调低,使得参数更新的慢一点以达到微调的目的。但有可能会导致整个收敛速度变慢,因此还需要增加最大迭代次数。
需要调节的参数(solver.prototxt)主要包括:
base_lr:初始学习率,这个是非常重要的一个参数;momentum:一般设置为0.9,如果base_lr特别低的话也可以设置为0.99或0.999等 weight_decay:默认0.005,可以适当调整,类似于正则化项;
lr_policy:学习率变化策略,常见的有fixed(固定), inv,step等,详细的说明见http://stackoverflow.com/questions/30033096/what-is-lr-policy-in-caffe
最后如果loss出现不收敛的情况,可以尝试一下以下几种方法:
- 调小solver里的初始学习率
- 数据量小的话,可以只对最后几层的权重进行调整,前面权重保持不变,即把前面的学习率置为0,一定程度上限制了激活的大小,这样就限制了某一过大的误差的影响,这样可以避免迭代方向出现过大的变化。
- 在GPU可承受的范围内调大batch_size的大小(贾扬清的解释:理论上batch小是不会影响收敛的。小batch主要的问题是在FC层的计算可能会不是很efficient,如果实在无计可施,可以试试 ;网上其他博主的解释:batch比较小 ,导致样本覆盖面过低,产生了非常多的局部极小点,在步长和方向的共同作用下,导致数据产生了震荡,导致了不收敛 )