max pooling是CNN当中的最大值池化操作,其实用法和卷积很类似
有些地方可以从卷积去参考【TensorFlow】 tf.nn.conv2d实现卷积的方式
tf.nn.max_pool(value, ksize, strides, padding, name=None)
参数是四个,和卷积很类似:
第一个参数value:需要池化的输入,一般池化层接在卷积层后面,所以输入通常是feature map,依然是[batch, height, width, channels]这样的shape
第二个参数ksize:池化窗口的大小,取一个四维向量,一般是[1, height, width, 1],因为我们不想在batch和channels上做池化,所以这两个维度设为了1
第三个参数strides:和卷积类似,窗口在每一个维度上滑动的步长,一般也是[1, stride,stride, 1]
第四个参数padding:和卷积类似,可以取'VALID' 或者'SAME'
返回一个Tensor,类型不变,shape仍然是[batch, height, width, channels]这种形式
示例源码:
假设有这样一张图,双通道
第一个通道:
第二个通道:
用程序去做最大值池化:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
import tensorflow as tf
a = tf.constant([
[[ 1.0 , 2.0 , 3.0 , 4.0 ],
[ 5.0 , 6.0 , 7.0 , 8.0 ],
[ 8.0 , 7.0 , 6.0 , 5.0 ],
[ 4.0 , 3.0 , 2.0 , 1.0 ]],
[[ 4.0 , 3.0 , 2.0 , 1.0 ],
[ 8.0 , 7.0 , 6.0 , 5.0 ],
[ 1.0 , 2.0 , 3.0 , 4.0 ],
[ 5.0 , 6.0 , 7.0 , 8.0 ]]
])
a = tf.reshape(a,[ 1 , 4 , 4 , 2 ])
pooling = tf.nn.max_pool(a,[ 1 , 2 , 2 , 1 ],[ 1 , 1 , 1 , 1 ],padding = 'VALID' )
with tf.Session() as sess:
print ( "image:" )
image = sess.run(a)
print (image)
print ( "reslut:" )
result = sess.run(pooling)
print (result)
|
这里步长为1,窗口大小2×2,输出结果:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
image:
[[[[ 1. 2. ]
[ 3. 4. ]
[ 5. 6. ]
[ 7. 8. ]]
[[ 8. 7. ]
[ 6. 5. ]
[ 4. 3. ]
[ 2. 1. ]]
[[ 4. 3. ]
[ 2. 1. ]
[ 8. 7. ]
[ 6. 5. ]]
[[ 1. 2. ]
[ 3. 4. ]
[ 5. 6. ]
[ 7. 8. ]]]]
reslut:
[[[[ 8. 7. ]
[ 6. 6. ]
[ 7. 8. ]]
[[ 8. 7. ]
[ 8. 7. ]
[ 8. 7. ]]
[[ 4. 4. ]
[ 8. 7. ]
[ 8. 8. ]]]]
|
池化后的图就是:
证明了程序的结果是正确的。
我们还可以改变步长
1
|
pooling = tf.nn.max_pool(a,[ 1 , 2 , 2 , 1 ],[ 1 , 2 , 2 , 1 ],padding = 'VALID' )
|
最后的result就变成:
1
2
3
4
5
6
|
reslut:
[[[[ 8. 7. ]
[ 7. 8. ]]
[[ 4. 4. ]
[ 8. 8. ]]]]
|
以上这篇TensorFlow tf.nn.max_pool实现池化操作方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/mao_xiao_feng/article/details/53453926