tf.nn.max_pool实现池化操作

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]这种形式


示例源码:

假设有这样一张图,双通道

   

用程序去做最大值池化:

import tensorflow as tf

# 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'

# 每一列,刚好拼成一个通道,每一个通道值组成一个为二维列表
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:\n",sess.run(a))  
    print("reslut:\n",sess.run(pooling))  

结果如下

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.]]]]

  

一个四维矩阵里面有几个三维矩阵,表示有几个图片,(一个三维矩阵对应一张图片)每一列组成的二维数组,表示一个通道,上面池化后的图像分别对应第一通道和第二通道。(可以参考https://mp.csdn.net/postedit/103393322解释)

我们还可以改变步长

pooling=tf.nn.max_pool(a,[1,2,2,1],[1,2,2,1],padding='VALID')

最后的result就变成:

reslut:
[[[[ 8.  7.]
   [ 7.  8.]]
 
  [[ 4.  4.]
   [ 8.  8.]]]]


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值