Memory 带有大型过滤器的tensorflow conv2d的内存使用
我有一个tensorflow模型,带有一些相对较大的Memory 带有大型过滤器的tensorflow conv2d的内存使用,memory,tensorflow,convolution,Memory,Tensorflow,Convolution,我有一个tensorflow模型,带有一些相对较大的135x135x1x3卷积滤波器。我发现tf.nn.conv2d对于如此大的过滤器变得不可用-它试图使用超过60GB的内存,此时我需要杀死它。以下是复制我的错误的最低脚本: 将tensorflow导入为tf 将numpy作为np导入 帧,高度,宽度,通道=200321481,1 filter_h,filter_w,filter_out=5,5,3#这样,输出具有形状(200317477,3) #filter_h,filter_w,filter_
135x135x1x3
卷积滤波器。我发现tf.nn.conv2d
对于如此大的过滤器变得不可用-它试图使用超过60GB的内存,此时我需要杀死它。以下是复制我的错误的最低脚本:
将tensorflow导入为tf
将numpy作为np导入
帧,高度,宽度,通道=200321481,1
filter_h,filter_w,filter_out=5,5,3#这样,输出具有形状(200317477,3)
#filter_h,filter_w,filter_out=7,7,3#这样,输出具有形状(200315475,3)
#filter_h,filter_w,filter_out=135,135,3#这样,输出将小于上面的形状(200187347,3),但内存使用量会激增
images=np.random.randn(帧、高度、宽度、通道).astype(np.float32)
filters=tf.Variable(np.random.randn(filter\u h,filter\u w,channels,filter\u out).astype(np.float32))
图像输入=tf.placeholder(tf.float32)
conv=tf.nn.conv2d(图像输入、过滤器、步幅=[1,1,1,1],padding=“VALID”)
使用tf.Session()作为sess:
sess.run(tf.global\u variables\u initializer())
result=sess.run(conv,feed\u dict={images\u input:images})
打印结果.shape
首先,有人能解释这种行为吗?为什么内存使用会随着过滤器大小而膨胀?(注意:我还尝试改变我的尺寸,用一个conv3d
代替一批conv2d
s,但这也有同样的问题)
第二,除了将操作分解为200个单独的单图像卷积,还有谁能提出解决方案吗
编辑:在重新阅读了关于tf.nn.conv2d()
的内容后,我在解释其工作原理时注意到了这一点:
[过滤器高度*过滤器宽度*输入通道,输出通道]
[批处理、输出高度、输出宽度、过滤器高度*过滤器宽度*输入通道]
为了使大的滤波器卷积,你必须对C++中的大的滤波器实现卷积,并将它作为一个新的OP添加到TysFooSo../P>它实际上是在CPU上调试时这样做的,它是这样做的,因为它把卷积变成矩阵乘法,因此,您可以使用线性代数库来实现它。在GPU上运行它实际上可能需要更少的内存。