【问题标题】:Why does Tensorflow CNN use too much memory?为什么 Tensorflow CNN 会占用太多内存?
【发布时间】:2017-09-11 01:52:10
【问题描述】:

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

【问题讨论】:

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

标签: machine-learning tensorflow deep-learning convolution data-science


【解决方案1】:

4000 听起来一口气很多。我见过的大多数例子在每批中训练了几百个。我想所有的图像可能会一次加载到内存中,因此内存使用率很高。

您可以尝试使用较小的批次进行训练吗? 1000,甚至500,看看内存使用是否下降?

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 减少batch确实可以减少内存使用,但是由于标记的训练数据太多。它需要更多的批次来运行所有的训练数据,这意味着更多的时间来收敛。是减少内存使用的唯一方法吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-13
    • 2023-04-10
    • 2021-12-10
    • 2018-10-10
    • 1970-01-01
    • 1970-01-01
    • 2015-10-14
    相关资源
    最近更新 更多