我在深度学习及其框架方面相对较新。目前,我正在尝试使用Caffe框架并尝试微调Vgg16_places_365。
我正在使用带有4个GPU的Amazone EC2实例g2.8xlarge(每个都有4 GB的RAM)。但是,当我尝试训练我的模型(使用单个GPU)时,我收到了这个错误:
检查失败:错误== cudaSuccess(2对0)内存不足
在我做了一些研究之后,我发现解决这种内存不足问题的方法之一是减少我的火车中的批量大小.prototxt
Caffe | Check failed: error == cudaSuccess (2 vs. 0) out of memory
最初,我将批量大小设置为50,并迭代地将其缩小到10(因为它在batch_size = 10时有效)。 现在,该模型正在接受培训,我很确定这需要很长时间。但是,作为这个领域的新手,我很好奇这个批量大小与另一个参数之间的关系,例如学习率,步长,甚至是我们在solver.prototxt中指定的最大迭代。
批次的大小会对模型的质量产生多大影响(如准确性)。如何使用其他参数来提高质量。此外,有没有另一种方法来解决这个问题,而不是减少批量大小或扩大我的机器?
答案 0 :(得分:1)
要回答关于参数之间关系的第一个问题,例如批量大小,学习率和最大迭代次数,您最好阅读有关数学背景的内容。一个好的起点可能就是这个stats.stackexchange问题:How large should the batch size be for stochastic gradient descent?。答案将简要讨论批量大小和学习率之间的关系(从你的问题我假设学习率=步长),并为进一步阅读提供一些参考。
要回答您的上一个问题,使用您正在进行微调的数据集并修复模型(即VGG16)(即固定大小的输入数据和固定大小的模型),您将很难避免大批量大小的内存不足问题。但是,如果您愿意减小输入尺寸或模型尺寸,则可以使用更大的批量。根据您精确调整的方式(以及具体情况),可以通过丢弃学习的图层或减少完全连接的图层的数量/尺寸来缩小模型尺寸。
剩下的问题,即批量大小对质量/准确度的影响以及其他参数如何影响质量/准确性,如果不了解您要解决的具体问题,很难回答。例如,影响达到准确度的批量大小可能取决于各种因素,例如数据集中的噪声,数据集的维数,数据集的大小以及学习率(= stepsize)或动量参数等其他参数。对于这类问题,我建议使用textbook by Goodfellow et al.,例如第11章可能会提供一些关于选择这些超量计的一般指导原则(即批量化,学习率等)。
答案 1 :(得分:1)
解决问题的另一种方法是使用计算机上的所有GPU。如果您的GPU上有4x4=16
GB RAM,那就足够了。如果您在命令模式下运行caffe,只需按如下所示添加--gpu参数(假设您有4个GPU索引为默认值0,1,2,3):
build/tools/caffe train --solver=solver.prototxt --gpu=0,1,2,3
但是,如果您使用的是python接口,则尚不支持使用多个GPU运行。
我可以指出一些一般提示来回答你关于批量大小的问题: - 批量大小越小,学习的随机性就越大 - >减少训练数据过度拟合的可能性;更高的不收敛概率。 - caffe中的每次迭代都会获取一批数据,向前运行并以反向传播结束。 - 假设您的培训数据为50&000,您的批量大小为10;然后在1000次迭代中,10到39个数据已被馈送到网络。在相同的方案场景中,如果批量大小为50,则在1000次迭代中,网络将查看您的所有训练数据。这被称为一个时代。您应该以一定的方式设计批量大小和最大迭代次数,以便为您的网络训练一定数量的时期。 - 逐步增加caffe,是在将学习率与伽马值相乘之前求解器将运行的迭代次数(如果您已将训练方法设置为"步骤")。