max pooling是CNN当中的最大值池化操作,其实用法和卷积很类似
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]这种形式
最初的矩阵是这样的,维度是[2, 4, 4]
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_new = tf.reshape(a, [1, 4, 4, 2])
经过reshape操作后,变成下面这样,作为输入,矩阵的含义为 (batch_size, height, width, channels),这里的channel数为2,所以有两个通道,红色代表channel 1,蓝色代表channel 2。
pooling=tf.nn.max_pool(a_new,[1,2,2,1],[1,1,1,1],padding='VALID')
pooling = tf.nn.max_pool(
h,
ksize=[1, height, width, 1],
strides=[1, 1, 1, 1],
padding='VALID',
name="pool")
h : 需要池化的输入,一般池化层接在卷积层后面,所以输入通常是feature map,依然是[batch_size, height, width, channels]这样的shape
k_size : 池化窗口的大小,取一个四维向量,一般是[1, height, width, 1],因为我们不想在batch和channels上做池化,所以这两个维度设为了1
strides : 窗口在每一个维度上滑动的步长,一般也是[1, stride,stride, 1]
padding: 填充的方法,SAME或VALID,SAME表示添加全0填充,VALID表示不添加
这里的k_size 维度是[1, 2, 2, 1],形状如下
用k_size 分别遍历a_new的两个channel
首先,对第一个channel的第一列和第二列的前两行进行max_pool,得到最大值为8,然后对第二个channel的第一列和第二列的前两行进行max_pool,得到最大值为7,遍历完前两行后, 接着对第一个channel的第一列和第二列的中间两行进行max_pool,的搭配最大值为6,这样依次遍历下去,最终得到的结果是
max_pool操作中的维度变化
h = [batch_size, height_1, width_1, channels]
ksize = [1, height_2, width_2, 1]
最终得到的pool的shape为
[batch_size, height_1-height_2+1, width_1-width_2+1,channels]
参考:
https://blog.csdn.net/m0_37586991/article/details/84575325