在网上找了很久关于这个函数的解释,都没有找到相关的解释:看了一下官网也没有怎么搞懂,到底是怎么求解的。

自己写了几个最简单的例子,算是解释吧!

一、函数原型

函数的原型:

tf.nn.pool(input,window_shape,pooling_type,padding,dilation_rate=None,strides=None,name=None,data_format=None
)

参数解释:

input:张量的秩为N+2,这个N是window_shape的长度,默认的情况下,我们的输入的方式是按照[batch_size,input_spatial_shape,num_channels],如果不是默认的方式,也就是按照NC的方式排布的话,我们的input的shape为[batch_size,num_channels,input_spatial_shape]。很显然,池化的操作仅仅在输入的spatial dimensions.

window_shape:由N个int组成的,N大于等于1.

pooling_type:是池化的方式,只有两种AVG或者是MAX

padding:只有两种“SAME”或者是“VALID”,SAME就是和原本的input具有相同的大小,VALID就是正常的操作。

dilation_rate:可选,

strides:可选,

name:可选,

data_format:一个字符串或者为NONE,表示的是input的通道channel是否是输入的最后一个维度。默认是channel是最后的一个维度,如果是第二个维度的话,那么data_format开始于“NC”。

返回的是:秩为N+2的张量,大小是[batch_size,output_spatial_shape,num_channels](如果data_format为None,或者不开始于NC),反之大小为[batch_size,num_channels,output_sparial_shape].

如果padding=“SAME”,output_spatial_shape[i] = ceil(input_spatial_shape[i] / strides[i])

如果padding=“VALID”,output_spatial_shape[i] = ceil((input_spatial_shape[i] - (window_shape[i] - 1) * dilation_rate[i]) / strides[i]).

二、例子

例子一:

import tensorflow as tftemp=[0.,0.,1.,0.,0.,0.,1.5,1.5,3.,3.,0.,2.,1.,0.,1.,0.,1.,-1.0]
values=tf.reshape(temp,[2,3,3,1])p_avg=tf.nn.pool(input=values,window_shape=[2,1],pooling_type='AVG',padding='VALID'
)p_max=tf.nn.pool(input=values,window_shape=[3,3],pooling_type='MAX',padding="VALID"
)with tf.Session() as sess:print("values")print(sess.run(values))print("pool-avg")print("shape:",sess.run(tf.shape(p_avg)))print(sess.run(p_avg))print("pool-max")print("shape:",sess.run(tf.shape(p_max)))print(sess.run(p_max))

结果:

values
[[[[ 0. ][ 0. ][ 1. ]][[ 0. ][ 0. ][ 0. ]][[ 1.5][ 1.5][ 3. ]]][[[ 3. ][ 0. ][ 2. ]][[ 1. ][ 0. ][ 1. ]][[ 0. ][ 1. ][-1. ]]]]
pool-avg
shape: [2 2 3 1]
[[[[0.  ][0.  ][0.5 ]][[0.75][0.75][1.5 ]]][[[2.  ][0.  ][1.5 ]][[0.5 ][0.5 ][0.  ]]]]
pool-max
shape: [2 1 1 1]
[[[[3.]]][[[3.]]]]

先从shape开始分析吧,我们知道pool仅仅操作于输入的spatial dimension,所以对于该例子来说,仅仅操作于第二维度和第三维度,那么很显然,AVG的时候,[3,3]---经过[2,1]---得到---[2,3],所以输出的shape为[2,2,3,1].同理,在对MAX的时候,[3,3]---经过[3,3]---得到[1,1],所以最后的shape为[2,1,1,1]。

再来分析为什么得到上面的结果吧,我们可以把第一维度的batch_size先丢掉一边.

例子二:只是将维度增加了,没什么难度,为了更好的理解

import tensorflow as tftemp=[0.,0.,1.,0.,0.,0.,1.5,1.5,3.,3.,0.,2.,1.,0.,1.,0.,1.,-1.0,0.,1.,0.,2.,0.,-3.,0.,0.,2.,0.,0.,0.,2.5,1.5,-3.,-3.,0.,-2.,1.,1.,2.,0.,1.,1.0,0.,1.,0.,2.,0.,3.]
values=tf.reshape(temp,[2,4,3,2])p_avg=tf.nn.pool(input=values,window_shape=[2,1],pooling_type='AVG',padding='VALID'
)p_max=tf.nn.pool(input=values,window_shape=[3,3],pooling_type='MAX',padding="VALID"
)with tf.Session() as sess:print("values")print(sess.run(values))print("pool-avg")print("shape:",sess.run(tf.shape(p_avg)))print(sess.run(p_avg))print("pool-max")print("shape:",sess.run(tf.shape(p_max)))print(sess.run(p_max))

结果:

values
[[[[ 0.   0. ][ 1.   0. ][ 0.   0. ]][[ 1.5  1.5][ 3.   3. ][ 0.   2. ]][[ 1.   0. ][ 1.   0. ][ 1.  -1. ]][[ 0.   1. ][ 0.   2. ][ 0.  -3. ]]][[[ 0.   0. ][ 2.   0. ][ 0.   0. ]][[ 2.5  1.5][-3.  -3. ][ 0.  -2. ]][[ 1.   1. ][ 2.   0. ][ 1.   1. ]][[ 0.   1. ][ 0.   2. ][ 0.   3. ]]]]
pool-avg
shape: [2 3 3 2]
[[[[ 0.75  0.75][ 2.    1.5 ][ 0.    1.  ]][[ 1.25  0.75][ 2.    1.5 ][ 0.5   0.5 ]][[ 0.5   0.5 ][ 0.5   1.  ][ 0.5  -2.  ]]][[[ 1.25  0.75][-0.5  -1.5 ][ 0.   -1.  ]][[ 1.75  1.25][-0.5  -1.5 ][ 0.5  -0.5 ]][[ 0.5   1.  ][ 1.    1.  ][ 0.5   2.  ]]]]
pool-max
shape: [2 2 1 2]
[[[[3.  3. ]][[3.  3. ]]][[[2.5 1.5]][[2.5 3. ]]]]

首先还是分析shape,很显然,pool只针对于第二第三维度,所以我们的输入为[4,3]----经过AVG[2,1]---得到的是[3,3],所以最后的结果为[2,3,3,2];对于MAX,我们的输入的大小是[4,3]--经过MAX[3,3]--得到的是[2,1].

接着是分析为什么得到这样的结果,下图仅仅分析了输入的第一个batch的AVG的结果!其他同理。

tf.nn.pool()相关推荐

  1. 深度学习原理与框架-CNN在文本分类的应用 1.tf.nn.embedding_lookup(根据索引数据从数据中取出数据) 2.saver.restore(加载sess参数)...

    1. tf.nn.embedding_lookup(W, X) W的维度为[len(vocabulary_list), 128], X的维度为[?, 8],组合后的维度为[?, 8, 128] 代码说 ...

  2. 【TensorFlow】TensorFlow函数精讲之tf.nn.max_pool()和tf.nn.avg_pool()

    tf.nn.max_pool()和tf.nn.avg_pool()是TensorFlow中实现最大池化和平均池化的函数,在卷积神经网络中比较核心的方法. 有些和卷积很相似,可以参考TensorFlow ...

  3. TensorFlow基础篇(六)——tf.nn.max_pool()和tf.nn.avg_pool()

    tf.nn.max_pool()和tf.nn.avg_pool()是TensorFlow中实现最大池化和平均池化的函数,在卷积神经网络中比较核心的方法. 有些和卷积很相似,可以参考TensorFlow ...

  4. 通俗理解tf.nn.conv2d() tf.nn.conv3d( )参数的含义 pytorhc 卷积

    20210609 例如(3,3,(3,7,7))表示的是输入图像的通道数是3,输出图像的通道数是3,(3,7,7)表示过滤器每次处理3帧图像,卷积核的大小是3 x 7 x 7. https://blo ...

  5. 【Tensorflow】tf.nn.atrous_conv2d如何实现空洞卷积?膨胀卷积

    介绍 关于空洞卷积的理论可以查看以下链接,这里我们不详细讲理论: 1.Long J, Shelhamer E, Darrell T, et al. Fully convolutional networ ...

  6. 【TensorFlow】理解tf.nn.conv2d方法 ( 附代码详解注释 )

    最近在研究学习TensorFlow,在做识别手写数字的demo时,遇到了tf.nn.conv2d这个方法,查阅了官网的API 发现讲得比较简略,还是没理解.google了一下,参考了网上一些朋友写得博 ...

  7. tf.nn.embedding_lookup()的用法

    函数: tf.nn.embedding_lookup( params, ids, partition_strategy='mod', name=None, validate_indices=True, ...

  8. tf.nn.relu

    tf.nn.relu(features, name = None) 这个函数的作用是计算激活函数 relu,即 max(features, 0).即将矩阵中每行的非最大值置0. import tens ...

  9. tf.nn.l2_loss() 与 权重衰减(weight decay)

    权重衰减(weight decay)   L2正则化的目的就是为了让权重衰减到更小的值,在一定程度上减少模型过拟合的问题,所以权重衰减也叫L2正则化.   L2正则化就是在代价函数后面再加上一个正则化 ...

最新文章

  1. ElasticSearch + xpack 使用
  2. Sublime Text(2/3)编译lua
  3. idea启动tomcat很慢_idea使用maven创建web项目
  4. 杂项-Java:JSP
  5. Cocos2d-x v3.1 坐标系统(五)
  6. 22行代码AC_Prime Number Aizu - 0009(素数筛)(解题报告)
  7. java通用日志记录_JAVA实现通用日志记录方法
  8. 参数php_干净的PHP代码-函数参数
  9. 【重大修改】动态时间规整(Dynamic Time Warping)
  10. 昨晚停网后,我写了一段Python代码破解了隔壁小姐姐的wifi密码,结果亮了!
  11. gp数据库中Appendonly与compresslevel
  12. 编程疑难杂症の真的非常一样的文本?!
  13. Microsoft.AlphaImageLoader滤镜解说
  14. 计算机网络怎样连手机软件,玩够了手机投屏?了解一下手机如何直接连智能电视...
  15. 关于知云文献翻译显示乱码,无法翻译的解决方法
  16. 热敏电阻制作温度传感器的c语言,NTC热敏电阻温度测量和控制系统.doc
  17. 工作绩效数据 工作绩效报告 偏差分析 变更控制流程 变更控制委员会
  18. AOPlog4j2propagation的7种事务配置
  19. 中国人保为易集康健康科技承保产品责任险,为消费者保驾护航!
  20. Neo4j技能树学习之路

热门文章

  1. BZOJ 4407: 于神之怒加强版|莫比乌斯反演
  2. php百度收录排名代码,PHP查询百度收录数量代码
  3. 【Qt】 Fractal Designer 5.1 - Help(中文版)
  4. 玄魂工作室--咪噜妹
  5. JSP入门教程(1)
  6. 物联网还有哪些创业机会?
  7. 记录一下润乾报表填报的制作
  8. char* 和char[]的区别
  9. jump-game(跳跃游戏)
  10. 关于branch XYZ is published (but not merged) and is now N commits behind错误的一点分析