学习深度学习很长一段时间的时间了,也学习了CNN网络,可是总是对卷积核的实际计算不是太了解,按照很多的讲解都是讲解padding后能够整除步长的情况,后来发现有时padding在原始图像两个的宽度不一致,所以这次想研究研究到底是怎么实现的.另外根据计算的结果进行了画图研究,这样更加方便于理解.
import tensorflow as tf
input = tf.ones([1, 8, 8, 1], tf.float32)
a = [[[[1.]],[[-1]],[[-1]]],
[[[1.]],[[1]],[[-2]]],
[[[1.]],[[-2]],[[1]]] ]
filter = tf.Variable(a)
b = tf.constant([0.1])
op1 = tf.nn.conv2d(input, filter, strides=[1,3,3,1], padding='SAME')
op2 = tf.nn.bias_add(op1, b)
op3 = tf.nn.relu(op2)
init = tf.initialize_all_variables()
with tf.Session() as sess:
sess.run(init)
print("op1:",sess.run(op1))
print("op2:",sess.run(op2))
print("op3:",sess.run(op3))
这段代码的运行结果如下(为了便于观察,对结果的显示格式进行了调整,这不影响结果):
op1: [[[[-1.],[-1.],[ 1.]]
[[-1.],[-1.],[ 1.]]
[[-1.],[-1.],[ 2.]]]]
op2: [[[[-0.9],[-0.9],[ 1.1]]
[[-0.9],[-0.9],[ 1.1]]
[[-0.9],[-0.9],[ 2.1]]]]
op3: [[[[0. ],[0. ],[1.1]]
[[0. ],[0. ],[1.1]]
[[0. ],[0. ],[2.1]]]]
下面是对以上运行的可视化解释,如有不对的地方,请大家指出,一起研究学习:
从图中可以看出,在第一步进行卷积时由于步长的缘故需要进行padding,但是只有像图中那样进行不对称的padding才能和结果相匹配, 然后是进行第二步的增加偏执项,最后是进行Relu进行非线性激活.
ps:不废话了,有问题欢迎讨论