在进行tf.nn.conv2d进行卷积计算的时候有两个特殊的卷积核,一个是1x1,另一个就是和原始图像大小一样的卷积核,这里分别进行验证.
一 卷积核是1x1的情况
一般情况,步长并不会比卷积核的尺寸大, 因为如果步长比卷积核的尺寸大就会丢失数据,因此这只考虑步长等于1 的情况
import tensorflow as tf
input = tf.ones([1, 5, 5, 1], tf.float32)
filter = tf.ones([1, 1, 1, 1], tf.float32)
op1 = tf.nn.conv2d(input, filter, strides=[1,1,1,1], padding='SAME')
op2 = tf.nn.conv2d(input, filter, strides=[1,1,1,1], padding='VALID')
print("op1:",op1)
print("op2:",op2)
init = tf.initialize_all_variables()
with tf.Session() as sess:
sess.run(init)
print("op1:",sess.run(op1))
print("op2:",sess.run(op2))
输出的结果如下:
op1: Tensor("Conv2D_20:0", shape=(1, 5, 5, 1), dtype=float32)
op2: Tensor("Conv2D_21:0", shape=(1, 5, 5, 1), dtype=float32)
op1:
[[[[1.] [1.] [1.] [1.] [1.]]
[[1.] [1.] [1.] [1.] [1.]]
[[1.] [1.] [1.] [1.] [1.]]
[[1.] [1.] [1.] [1.] [1.]]
[[1.] [1.] [1.] [1.] [1.]]]]
op2:
[[[[1.] [1.] [1.] [1.] [1.]]
[[1.] [1.] [1.] [1.] [1.]]
[[1.] [1.] [1.] [1.] [1.]]
[[1.] [1.] [1.] [1.] [1.]]
[[1.] [1.] [1.] [1.] [1.]]]]
可见不论是'SAME', 还是'VALID'对结果没有改变,因为此时不会进行padding.
二 卷积核大小和原始图像一样的情况
input = tf.ones([1, 7, 7, 1], tf.float32)
filter = tf.ones([7, 7, 1, 1], tf.float32)
op1 = tf.nn.conv2d(input, filter, strides=[1,1,1,1], padding='SAME')
op2 = tf.nn.conv2d(input, filter, strides=[1,3,3,1], padding='SAME')
op3 = tf.nn.conv2d(input, filter, strides=[1,1,1,1], padding='VALID')
print("op1:",op1)
print("op2:",op2)
print("op3:",op3)
init = tf.initialize_all_variables()
with tf.Session() as sess:
sess.run(init)
print("op1:\n",sess.run(op1))
print("op2:\n",sess.run(op2))
print("op3:\n",sess.run(op3))
结果如下:
op1: Tensor("Conv2D_26:0", shape=(1, 7, 7, 1), dtype=float32)
op2: Tensor("Conv2D_27:0", shape=(1, 3, 3, 1), dtype=float32)
op3: Tensor("Conv2D_29:0", shape=(1, 1, 1, 1), dtype=float32)
op1:
[[[[16.] [20.] [24.] [28.] [24.] [20.] [16.]]
[[20.] [25.] [30.] [35.] [30.] [25.] [20.]]
[[24.] [30.] [36.] [42.] [36.] [30.] [24.]]
[[28.] [35.] [42.] [49.] [42.] [35.] [28.]]
[[24.] [30.] [36.] [42.] [36.] [30.] [24.]]
[[20.] [25.] [30.] [35.] [30.] [25.] [20.]]
[[16.] [20.] [24.] [28.] [24.] [20.] [16.]]]]
op2:
[[[[16.] [28.] [16.]]
[[28.] [49.] [28.]]
[[16.] [28.] [16.]]]]
op3:
[[[[49.]]]]
下面利用图形进行分析计算过程:
op1: 步长是1,'SAME':
op2: 步长是3(这里可换成其他的数据如5),'SAME':
op3: 步长是1,'VALID':