我在理解和复制CIFAR-10数据集上ResNet的原始实现时遇到了麻烦,正如论文"深度残差学习用于图像识别"中所描述的那样。具体来说,我对下面的文章有几个问题:
我们使用0.0001的权重衰减和0.9的动量,,采用[13]和BN[16]中的权重初始化,但没有辍学率。这些模型在两个gpu上以128的小批量大小进行训练。我们从学习开始速率为0.1,在32k和48k迭代时将其除以10,并且在64 k的迭代终止训练,这是确定45公里/5公里的火车/val分割。我们按照[24]中的简单数据增强方法进行训练:每边填充4个像素,从填充中随机抽取32×32作物图像或其水平翻转。对于测试,我们只评估原始32×32图像的单一视图。
-
在两个gpu上的小批量大小为128需要什么?这是否意味着每个GPU的批处理大小是64?
-
如何将迭代转换为epoch ?模型是否训练为64000 * 128/45000 = 182.04个epoch ?
-
如何在PyTorch中实现训练和学习率调度?由于45000不能被128整除,我是否应该每个epoch删除最后72张图像?此外,由于32k、48k和64k的里程碑并不是在一个完整的时间点上,我应该把它们四舍五入到最近的时间点上吗?或者是否有一种方法可以改变学习率并在一个epoch的中间终止训练?
如果有人能给我指出正确的方向,我将不胜感激。我是深度学习的新手,谢谢你的帮助和理解。
- 在两个gpu上的小批量大小为128需要什么?这是否意味着每个GPU的批处理大小是64?
当在同一台机器上运行两个gpu时,批处理大小在gpu之间分配,正如你所说的。两个gpu产生的梯度将被传输,平均并应用于其中一个gpu,或者可能应用于CPU。
更多信息:https://pytorch.org/tutorials/beginner/former_torchies/parallelism_tutorial.html
- 如何将迭代转换为epoch ?模型是否训练为64000 * 128/45000 = 182.04个epoch ?
我鼓励每个人都从迭代而不是时代的角度来思考。每次迭代相当于一次权重更新,这比一个历元与模型收敛更相关。如果你想以epoch为单位每次你尝试不同的batch大小时你都需要调整训练的epoch数。如果您使用迭代(即训练步骤或权重更新)来考虑,情况就不是这样了。但是你的公式在计算年代上是正确的。
- 我如何在PyTorch中实现训练和学习率调度?
我认为这个pytorch帖子回答了这个问题,看起来这是添加到pytorch(抱歉这里的非权威答案,我更熟悉Tensorflow):
https://forums.pytorchlightning.ai/t/training-for-a-set-number-of-iterations-without-setting-epochs/178
https://github.com/Lightning-AI/lightning/pull/5687
当然,你也可以只使用epoch,调整学习率并不一定要完全发生在论文描述的同一点,只要你能合理地得到舍入误差就可以了。