2017-06-25 43 views
2

我在CPU上运行一个简单的带有TensorFlow的卷积神经网络,使用Python/Numpy从磁盘加载数据并进行准备。 Python/Numpy部分消耗的内存非常少,因为我只加载了32个1MB图像。内存高效的设计技巧TensorFlow NN

但是,在运行sess.run(AdamOptimizer)内存使用率达到天文数字峰值时,可以看到在memory_profiler以下输出,显示了4个训练周期和一个测试周期。 TensorFlow memory usage, 4 training cycles one test cycle, from https://pypi.python.org/pypi/memory_profiler

12GB峰值限制了我批量的大小,同时训练网络的数量或我的图层大小。我相信这个峰值与从Python到TF或者正向激活的数据传输有关,因为它在sess.run(accuracy)声明中等同存在。

我可能设计得不好CNN图吗?有人可以指出我应该记住的设计规则,特别是内存?有可能及时涂抹这个吗? - 如果12GB峰值增长了两倍并且是一半的话,这将是一个进步。最后是否有一种方法可以表示峰值开始和结束时间,以便我可以管理多个网络来进行隔行扫描? (请注意,在单个sess.run()声明中发生的缩小的2秒钟峰值大约需要20秒)

回答

1

如果别人有任何要添加的内容,我会很乐意将答案转移。只是想分享我发现的东西。

似乎tf.nn.conv2d尤其是内存饥饿,也许它总是感觉不知何故,但对我来说,它比预期的方式。下面这个简单的程序使用5.5GB,我不希望超过数100 MB的更多:

x = tf.placeholder(tf.float32, shape=[None, 256, 256, 4]) 
w = tf.Variable(tf.truncated_normal([f, f, 4, 8], stddev=0.1)) 
outp = tf.nn.conv2d(x, w, strides=[1,1,1,1], padding='SAME') 

outp_v = sess.run(outp, 
     feed_dict={x:np.ones(32*256*256*4).reshape(32,256,256,4)}) 

与内存分析器发现: https://pypi.python.org/pypi/memory_profiler/0.47 output. 该输出我用了相当大量f = 16,但我发现内存使用情况与其无关。除了在足够小的情况下,计算速度如此之快以至于它低于内存配置实用程序的时间分辨率,并且只有一个尖峰(没有平台)保留在任意高度。

其他人发现的内存使用情况类似: tensorflow conv2d memory consumption explain?