1. 官方解释
tf.nn.conv2d (input, filter, strides, padding, use_cudnn_on_gpu = True, data_format = 'NHWC', dilations = [1,1,1,1],
name = None)
input:4维张量。数据格式默认是NHWC, 即[batch,height,width,channel]。如[1,4,4,1],代表一个(batch),高(height)4,宽 (width)4,一个通道(channel)的图像。
filter: 4维张量。数据格式是[height,width,in_channels,out_channles]。如[2,2,1,1],代表高(2),宽(2),输入通道1,输出通 道 1。注意:如果输出通道为1,输入通道有多个,那么要进行求和变为1个。
padding: 有"VALID"和"SAME"之分。主要区别是,"SAME"是输入张量和输出的张量尺寸保持不变,为此需要在输入张量填 充 0,填充0的方式可能是在周围,也有可能是在张量的左边,下边。具体的要看情况。
strides: 必须是[1,strides,strides,1],表示每次移动strides(向下或向右)步。
其他参数就不细说了。
官网上还有这样一段话,不太懂。先记下
1.将滤镜展屏为具有形状的二维矩阵[height*width*channles,out_channel]
2.从输入张量中提取图像块已形成虚拟的形状张量[batch,out_height,out_width,height*width*channels]
2. 实证分析
import tensorflow as tf
input = tf.Variable(tf.round(10*tf.random_normal([1,4,4,1])))
filter= tf.Variable(tf.rount(5*tf.random_normal([2,2,1,1])))
result= tf.nn.conv2d(input,filter,strides=[1,1,1,1],padding='VALID')
init = tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init)
print("input",sess.run(input))
print("filter",sess.run(filter))
print("result",sess.run(result))
input:
[[[[-7.]
[10.]
[-19.]
[-8.]]
[[3.]
[9.]
[-6.]
[-5.]]
[[19.]
[1.]
[1.]
[1.]
[[-13.]
[-15.]
[-7.]
[-6.]]]]
filter [[[[5.]]
[[0.]]]
[[[6.]]
[[0.]]]]
conv[[[[-17.]
[104.]
[-131.]]
[[129.]
[51.]
[-24.]]
[[17.]
[-85.]
[-37.]]]]
#input 转为二维矩阵 ,矩阵高4,宽4,用下标可以很明白。
如input
[[[[a0000.]
[a0010.]
[a0020.]
[a0030.]]
[[a0100.]
[a0110.]
[a0120.]
[a0130.]]
[[a0200.]
[a0210.]
[a0220.]
[a0230.]
[[a0300.]
[a0310.]
[a0320.]
[a0330.]]]]
所以转成
[[-7,10,-19,-8]
[3, 9,-6,-5],
[19,1,1,1],
[-13,-15,7,6]]
filter转为
[[5,0],
[6,0]]
然后每次向左移动一步或向下移动一步。可以验证是对的。