tensorflow之平均池化
首先说一下我遇到的情况,刚开始学tensorflow,接触到池化pooling操作,其中有最大池化max_pooling、平均池化avg_pooling,其中平均池化avg_pooling资料上着重写的是用池化filter范围内的输入矩阵元素总和除以非零元素个数。上代码:
import tensorflow as tf
img=tf.constant([
[[0.0,4.0],[0.0,4.0],[0.0,4.0],[0.0,4.0]],
[[1.0,5.0],[1.0,5.0],[1.0,5.0],[1.0,5.0]],
[[0.0,6.0],[0.0,6.0],[0.0,6.0],[0.0,6.0]],
[[3.0,7.0],[3.0,7.0], [3.0,7.0],[3.0,7.0]]
])
img=tf.reshape(img,[1,4,4,2])
pooling=tf.nn.avg_pool(img,[1,4,4,1],[1,1,1,1],padding='SAME')
with tf.Session() as sess:
print("image:")
image=sess.run(img)
print (image)
result=sess.run(pooling)
print ("reslut:\n",result)
按照资料讲的,结果应该是
reslut:
[[[[1. 5. ]
[1. 5. ]
[1. 5. ]
[1. 5. ]]
[[2. 5.5 ]
[2. 5.5 ]
[2. 5.5 ]
[2. 5.5 ]]
[[2. 6. ]
[2. 6. ]
[2. 6. ]
[2. 6. ]]]
[[3. 6.5 ]
[3. 6.5 ]
[3. 6.5 ]
[3. 6.5 ]]]
但是实际上,结果如下:
reslut:
[[[[0.33333334 5. ]
[0.33333334 5. ]
[0.33333334 5. ]
[0.33333334 5. ]]
[[1. 5.5 ]
[1. 5.5 ]
[1. 5.5 ]
[1. 5.5 ]]
[[1.3333334 6. ]
[1.3333334 6. ]
[1.3333334 6. ]
[1.3333334 6. ]]
[[1.5 6.5 ]
[1.5 6.5 ]
[1.5 6.5 ]
[1.5 6.5 ]]]]
通过比较(可怜我用笔一步一步的套进去),发现取平均并不是对filter范围内的非零元素取平均,而是对filter范围内的非补零元素进行取平均,所谓非补零元素是指padding中补的的零元素之外的元素,即输入矩阵未经过补零操作前的元素(当然指的是filter范围内的)。