为什么 tensorflow 消耗这么多内存?

Mot*_*iss 1 python memory tensorflow convolutional-neural-network

  • 我有一个简单的 CNN(4 个 conv-pool-lrelu 层和 2 个完全连接的层)。
  • 我只在 CPU 上使用 TensorFlow(没有 GPU)。
  • 我有~6GB 的可用内存。
  • 我的批次由 56 张 640x640 像素 ( < 100 MB ) 的图像组成。

并且 TensorFlow 消耗的内存超过可用内存(显然导致程序崩溃)。

我的问题是:为什么 TensorFlow 需要这么多内存来运行我的网络?我不明白是什么占用了这么多空间(也许缓存数据几次以优化卷积计算?保存所有隐藏输出用于反向传播?)。有没有办法防止 TensorFlow 消耗这么多内存?

旁注:

  • 我无法减少批处理的大小,我正在尝试进行一些多实例学习,因此我需要在一次运行中计算所有补丁。
  • 我正在使用 AdamOptimizer
  • 我所有的卷积都是 5x5 窗口,1x1 步长,具有(从第一个到最后一个)32、64、128 和 256 个特征。我正在使用泄漏 ReLU 和 2x2 最大池化。FC 层由 64 个和 3 个神经元组成。
  • 使用 Ubuntu 16.4 / Python 3.6.4 / TensorFlow 1.6.0

Aka*_*yal 5

正如你所提到的:

我所有的卷积都是 5x5 窗口,1x1 步长,具有(从第一个到最后一个)32、64、128 和 256 个特征。我正在使用泄漏 ReLU 和 2x2 最大池化。FC 层由 64 个和 3 个神经元组成。

因此,网络的内存消耗如下:

Input: 640x640x3 = 1200(以 KB 为单位)

C1: 636x636x32 = 12.5 MB(stride=1 有效)

P1: 635x635x32 = 12.3 MB(stride=1 有效)

C2: 631x631x64 = 24.3 MB

P2: 630x630x64 = 24.2 MB

C3: 626x626x128 = 47.83 MB

P3: 625x625x128 = 47.68 MB

C4: 621x621x256 = 94.15 MB

P4: 620x620x256 = 93.84 MB

FC1: 64 = 0.0625 KB(可以忽略不计)

FC2: 3 = 0.003 KB(可忽略不计)

Total for one image = ~ 358 MB

For batch of 56 image = 56 x 358 ~19.6 GB

这就是为什么您的网络无法在6 GB. 尝试一些higher stridelower sized image将其调整到6 GB空间中。它应该工作。

您可以参考this以更好地理解内存消耗计算。