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