我正在尝试从GitHub运行动作识别代码。原始代码使用128个批处理大小和4个GPU。我只有两个GPU,所以我无法匹配其bacth大小数字。无论如何,我可以批量补偿这种差异。我在某处看到iter_size可以根据公式effective_batchsize= batch_size*iter_size*n_gpu
进行补偿。这个公式中的iter_size是多少?
我使用的是PYthorch而不是Caffe。
答案 0 :(得分:4)
在pytorch中,当您执行后退步骤(调用loss.backward()
或类似方法时),梯度会被累积。这意味着,如果您多次调用loss.backward()
,则不会替换先前计算的渐变,而是将新的渐变添加到先前的渐变上。这就是为什么在使用pytorch时,通常有必要将微型批处理之间的梯度显式归零(通过调用optimiser.zero_grad()
或类似方法)。
如果您的批量大小有限,则可以通过将大批量分解成较小的部分,然后仅调用optimiser.step()
来更新模型参数,从而模拟件已处理。
例如,假设您只能处理64个批次,但是您希望模拟128个批次。如果原始训练循环如下:
optimiser.zero_grad()
loss = model(batch_data) # batch_data is a batch of size 128
loss.backward()
optimiser.step()
然后您可以将其更改为:
optimiser.zero_grad()
smaller_batches = batch_data[:64], batch_data[64:128]
for batch in smaller_batches:
loss = model(batch) / 2
loss.backward()
optimiser.step()
,并且每种情况下对模型参数的更新都是相同的(除了一些小的数值误差外)。请注意,您必须重新调整损耗以使更新相同。
答案 1 :(得分:1)
重要的概念不是批量大小;这是您训练的时期数。您能否将批处理大小增加一倍,从而为您提供相同的群集批处理大小?如果是这样,那将直接补偿问题。如果不是,则将迭代次数加倍,因此您正在训练相同数量的纪元。该模型将快速克服批次早期偏差的影响。
但是,如果您愿意研究培训代码,myrtlecat
会给您一个答案,可以很好地消除批次大小差异。