【发布时间】:2016-04-09 17:16:51
【问题描述】:
我正在查看有关 tf.nn.conv2d here 的 tensorflow 文档。但我无法理解它的作用或它试图实现的目标。它在文档上说,
#1 : 将过滤器展平为具有形状的二维矩阵
[filter_height * filter_width * in_channels, output_channels].
现在这是做什么的?那是逐元素乘法还是只是简单的矩阵乘法?我也无法理解文档中提到的其他两点。我把它们写在下面:
#2:从输入张量中提取图像块,形成形状的虚拟张量
[batch, out_height, out_width, filter_height * filter_width * in_channels].# 3:对于每个补丁,将过滤器矩阵和图像补丁向量右乘。
如果有人能举个例子,一段代码(非常有帮助)并解释那里发生了什么以及为什么这样的操作,那将是非常有帮助的。
我尝试编写一小部分代码并打印出操作的形状。不过还是看不懂。
我尝试过这样的事情:
op = tf.shape(tf.nn.conv2d(tf.random_normal([1,10,10,10]),
tf.random_normal([2,10,10,10]),
strides=[1, 2, 2, 1], padding='SAME'))
with tf.Session() as sess:
result = sess.run(op)
print(result)
我了解卷积神经网络的点点滴滴。我研究了他们here。但是在 tensorflow 上的实现并不是我所期望的。所以它提出了这个问题。
编辑: 所以,我实现了一个更简单的代码。但我无法弄清楚发生了什么。我的意思是结果如何。如果有人能告诉我这个输出是什么过程产生的,那将非常有帮助。
input = tf.Variable(tf.random_normal([1,2,2,1]))
filter = tf.Variable(tf.random_normal([1,1,1,1]))
op = tf.nn.conv2d(input, filter, strides=[1, 1, 1, 1], padding='SAME')
init = tf.initialize_all_variables()
with tf.Session() as sess:
sess.run(init)
print("input")
print(input.eval())
print("filter")
print(filter.eval())
print("result")
result = sess.run(op)
print(result)
输出
input
[[[[ 1.60314465]
[-0.55022103]]
[[ 0.00595062]
[-0.69889867]]]]
filter
[[[[-0.59594476]]]]
result
[[[[-0.95538563]
[ 0.32790133]]
[[-0.00354624]
[ 0.41650501]]]]
【问题讨论】:
-
实际上在
tf.nn.conv2d()的GPU上默认启用了cudnn,因此当我们使用支持GPU的TF时,根本不会使用该方法,除非明确指定use_cudnn_on_gpu=False。 -
有一个关于统计数据交换的答案,我发现它非常有用:stats.stackexchange.com/a/454115/44735