Machine learning 为什么Tensorflow CNN使用了太多内存?

Machine learning 为什么Tensorflow CNN使用了太多内存?,machine-learning,tensorflow,deep-learning,convolution,data-science,Machine Learning,Tensorflow,Deep Learning,Convolution,Data Science,我是一名新的深度学习者,我正在使用Tensorflow训练cnn进行图像识别。训练图像均为128像素*128像素*3通道。在我的网络中,有3个conv层、3个maxpooling层和1个完全连接的层。我有超过180000张带标签的图片,所以我决定每批培训4000张图片。然而,培训过程甚至不能在我的笔记本电脑上运行,因为内存不够,所以我尝试使用一个带有64gb ram和2*E5 CPU的服务器来培训它。这一次它可以工作,但需要40GB以上的内存。 我很困惑,我用于训练的图像不是高分辨率图像(只有1

我是一名新的深度学习者,我正在使用Tensorflow训练cnn进行图像识别。训练图像均为128像素*128像素*3通道。在我的网络中,有3个conv层、3个maxpooling层和1个完全连接的层。我有超过180000张带标签的图片,所以我决定每批培训4000张图片。然而,培训过程甚至不能在我的笔记本电脑上运行,因为内存不够,所以我尝试使用一个带有64gb ram和2*E5 CPU的服务器来培训它。这一次它可以工作,但需要40GB以上的内存。
我很困惑,我用于训练的图像不是高分辨率图像(只有128*128)。但是为什么仍然要花费太多的内存(可能是批量太大了……)。这正常吗?如果这是正常的,人们如何使用gpu来训练神经网络,据我所知,gtx1080ti有11GB的内存,但仍然不足以训练我的网络

4000听上去像是一下子就有了很多。我见过的大多数例子都是每批几百个。我想所有的图像可能会一次加载到内存中,因此内存使用率很高


你能尝试小批量的训练吗?1000,甚至500,看看内存使用率是否会下降?

4000听上去像是一次就可以解决很多问题。我见过的大多数例子都是每批几百个。我想所有的图像可能会一次加载到内存中,因此内存使用率很高


你能尝试小批量的训练吗?1000,甚至500,看看内存使用是否下降?

对于TensorFlow,它将存储BP计算的中间值(例如层间梯度),因此输入的大小越大,它消耗的内存就越多。因此,减少批处理大小是减少内存使用的快速方法。

For TensorFlow将存储BP计算的中间值(例如层间梯度),因此输入的大小越大,消耗的内存越多。因此,减少批处理大小是减少内存使用的快速方法。

如果没有完整的体系结构,很难估计内存。然而,4000个批次的规模是巨大的;仅输入大小就为每批4000图像*(128*128)像素每图像*3通道每像素*4字节每通道=786432000字节=0.732421875 GB(假设您的网络使用tf.float32),这是巨大的。整个网络将更大,因为在训练期间,每一层都需要缓存反向传播步骤的输入。@Yahia Zakaria感谢您的分析。我确实可以减少批大小以减少内存使用,这意味着需要更多的批和时间来收敛。这是唯一的选择吗?有时这是唯一的选择。在某些情况下,可以优化网络本身(某些操作可以用其他更有效的选择或组合操作替代)。有时,在optimizer.minimize中选择不同的聚合方法会有所帮助(请参阅:)。但是,如果全部失败,那么减小批处理大小可能是唯一的选择。如果没有完整的体系结构,很难估计内存。然而,4000个批次的规模是巨大的;仅输入大小就为每批4000图像*(128*128)像素每图像*3通道每像素*4字节每通道=786432000字节=0.732421875 GB(假设您的网络使用tf.float32),这是巨大的。整个网络将更大,因为在训练期间,每一层都需要缓存反向传播步骤的输入。@Yahia Zakaria感谢您的分析。我可以减少批处理大小,以减少内存使用,这意味着要聚合更多的批和时间。这是唯一的选择吗?有时这是唯一的选择。在某些情况下,可以优化网络本身(某些操作可以用其他更有效的选择或组合操作替代)。有时,在optimizer.minimize中选择不同的聚合方法会有所帮助(请参阅:)。但是,如果所有操作都失败,那么减少批处理大小可能是唯一的选择。减少批处理确实可以减少内存使用量,但因为标记的训练数据太多了。它将需要更多的批次来运行所有的训练数据,这意味着需要更多的时间来收敛。减少内存使用量的唯一方法是什么?减少批处理确实可以减少内存使用量,但因为批处理中有太多标记的训练数据。它将需要更多的批次来运行所有的训练数据,这意味着需要更多的时间来收敛。这是减少内存使用的唯一方法吗?