1
  • 我有一个简单的 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
4

1 回答 1

5

正如你所提到的:

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

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

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

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

P1:635x635x32 = 12.3 MB(步幅=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以更好地理解内存消耗计算。

于 2018-04-30T06:39:30.093 回答