tf.nn.conv2d(input, filter, strides, padding, use_cudnn_on_gpu=None, name=None)
除去name参数用以指定该操作的name,与方法有关的一共五个参数:
第一个参数input:指需要做卷积的输入图像,它要求是一个Tensor,具有[batch, in_height, in_width, in_channels]这样的shape,具体含义是[训练时一个batch的图片数量, 图片高度, 图片宽度, 图像通道数],注意这是一个4维的Tensor,要求类型为float32和float64其中之一
第二个参数filter:相当于CNN中的卷积核,它要求是一个Tensor,具有[filter_height, filter_width, in_channels, out_channels]这样的shape,具体含义是[卷积核的高度,卷积核的宽度,图像通道数,卷积核个数],要求类型与参数input相同,有一个地方需要注意,第三维in_channels,就是参数input的第四维
第三个参数strides:卷积时在图像每一维的步长,这是一个一维的向量,长度4
第四个参数padding:string类型的量,只能是"SAME","VALID"其中之一,这个值决定了不同的卷积方式(后面会介绍)
第五个参数:use_cudnn_on_gpu:bool类型,是否使用cudnn加速,默认为true
import tensorflow as tf
input1 = tf.Variable(tf.random_normal([1, 3, 3, 5]))
filter1 = tf.Variable(tf.random_normal([1, 1, 5, 1]))
op = tf.nn.conv2d(input1, filter1, strides=[1, 1, 1, 1], padding='VALID')
init = tf.initialize_all_variables()
with tf.Session() as sess:
sess.run(init)
print(sess.run(input1))
print(sess.run(filter1))
print(sess.run(op))
结果
[[[[ 1.45758533 -0.09802289 -1.59479737 -0.16897383 0.14859726]
[ 1.28683913 0.81622362 -0.25950107 -1.59787464 -1.53971493]
[-1.50767624 -0.80565053 0.08329388 -1.13792372 -0.26977447]]
[[ 0.14864756 -0.28723699 -1.86747098 0.12153267 1.08284247]
[-0.35012725 -0.14097945 -1.10806382 1.75250912 -1.18908668]
[-1.41720486 0.30819464 -0.38090637 0.86877841 -0.47367322]]
[[-0.15385917 -1.48778439 -0.83307278 -1.77908075 1.23309827]
[-0.35756287 -0.93248796 0.52480459 -1.56932425 -0.73900026]
[ 0.44062671 -0.69042021 0.9337461 0.09909598 0.16418104]]]]
[[[[ 0.44201431]
[-0.73989844]
[ 1.08442032]
[ 0.24145503]
[-0.75509739]]]]
[[[[-1.16563511]
[ 0.46029031]
[-0.05104074]]
[[-2.53519988]
[ 0.06897072]
[-0.70007986]]
[[-1.23127699]
[ 1.28010321]
[ 1.618132 ]]]]
肯定有人好奇这些结果是怎么出来的。
[[ 1.45758533 -0.09802289 -1.59479737 -0.16897383 0.14859726]
[ 1.28683913 0.81622362 -0.25950107 -1.59787464 -1.53971493]
[-1.50767624 -0.80565053 0.08329388 -1.13792372 -0.26977447]]
上面那个3*5张量可以用下图表示
[[-1.16563511]
[ 0.46029031]
[-0.05104074]]
结果矩阵的第一个张量可以用下面图表示
input1那个张量用图表示如下
下面就是input1和filiter进行conv2d运算的过程
有不当之处请指正!