一. 池化:
padding="SAME"
import tensorflow as tf
import numpy as np
a = [[[[1,3,2],
[4,6,5],
[7,9,8]]]]
a = np.transpose(a, [1, 2, 3, 0])
print(a.shape)
b = tf.nn.max_pool(a, [1, 2, 2, 1], [1, 2, 2, 1], padding="SAME")
sess = tf.Session()
t = sess.run(b)
print(t.shape)
print(t)
sess.close()
结果
padding="VALID"
结果
二. 卷积
padding="SAME"
import tensorflow as tf
import numpy as np
a = [[[[1,3,2],
[4,6,5],
[7,9,8]]]]
a = np.transpose(a, [1, 2, 3, 0])
a = a.astype(dtype="float32")
filter = tf.Variable(tf.random_normal([2, 2, 1, 3]))
sess = tf.Session()
sess.run(tf.global_variables_initializer())
print(a.shape)
b = tf.nn.conv2d(a, filter, [1, 2, 2, 1], padding="SAME")
t = sess.run(b)
print(t.shape)
print(t)
sess.close()
结果:
padding="VALID"
结果:
三. 解释原因
池化与卷积函数的padding作用原理和效果是一样的(实验验证得出)。
模板在滑动时,可能存在覆盖不完全的地方,就比如用2*2的模板,对于VALID模式和SAME模式就不一样,SAME模式会补全橙色部分,而VALID模式就不会补全了,就把多余的地方全都舍去了。
若padding=“SAME", 原始数据(input)的height*width = h*w。且 strides=[1, a, b, 1]。则经过卷积或池化之后输出的数据height*width=ceil(h除以a得到的浮点数) * ceil(w除以b得到的浮点数)。其中ceil()是向上取整。