卷积神经网络内存使用

时间:2018-08-06 17:21:57

标签: python machine-learning deep-learning computer-vision conv-neural-network

我正在实施CNN。假设有1000000个训练示例,我的一层中的尺寸为20x30x30。

现在假设我必须计算这些示例的训练精度。然后,在前向传播中,我需要为该层存储1000000x20x30x30 = 180亿个值,这会占用太多内存。另一方面,如果我分别在每个训练示例上进行正向传播,则将花费太长时间。

我只是想知道如何解决此问题?

非常感谢您所做的一切!

1 个答案:

答案 0 :(得分:2)

您在这里遇到的问题通常通过批处理来解决(如注释中所述)。
无需遍历所有训练示例,您只需对一部分数据点进行采样,然后仅查看这几个示例即可更新权重。
与香草的“梯度下降”(GD)相比,其名称为“随机梯度下降”(SGD)。随机性来自使用随机子样本(通常为2的幂,即4、8、16、32等)。 现在,我们不再只是简单地进行迭代,而是在一个时期(传递所有训练数据)和一个简单的迭代(仅使用batch_size元素)之间进行区别

这也回答了您在评论中提到的部分问题(“为什么一次提供更多图像更有效?”): 由于您要在每次批处理之后更新权重(因此必须通过网络计算反向传播),因此到达下一个正向传递将花费更长的时间。

通常,SGD也是首选,以获得更好的收敛性。在实践中,与采取一个较大的步骤相比,采取许多较小的步骤可能会产生更好的结果。有关更多参考,请参阅this great lecture中的最后几张幻灯片。

由于您担心它会花很长时间:批处理量相当大的SGD(我个人甚至不会超过每批2 ^ 10个样本;一些论文已经“设定了大约128个样本的标准”)您很快就能获得良好的结果/收敛。您牺牲单次迭代的速度来获得更快的收敛速度。