tf.nn.pool()
在网上找了很久关于这个函数的解释,都没有找到相关的解释:看了一下官网也没有怎么搞懂,到底是怎么求解的。
自己写了几个最简单的例子,算是解释吧!
一、函数原型
函数的原型:
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()相关推荐
- 深度学习原理与框架-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] 代码说 ...
- 【TensorFlow】TensorFlow函数精讲之tf.nn.max_pool()和tf.nn.avg_pool()
tf.nn.max_pool()和tf.nn.avg_pool()是TensorFlow中实现最大池化和平均池化的函数,在卷积神经网络中比较核心的方法. 有些和卷积很相似,可以参考TensorFlow ...
- TensorFlow基础篇(六)——tf.nn.max_pool()和tf.nn.avg_pool()
tf.nn.max_pool()和tf.nn.avg_pool()是TensorFlow中实现最大池化和平均池化的函数,在卷积神经网络中比较核心的方法. 有些和卷积很相似,可以参考TensorFlow ...
- 通俗理解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 ...
- 【Tensorflow】tf.nn.atrous_conv2d如何实现空洞卷积?膨胀卷积
介绍 关于空洞卷积的理论可以查看以下链接,这里我们不详细讲理论: 1.Long J, Shelhamer E, Darrell T, et al. Fully convolutional networ ...
- 【TensorFlow】理解tf.nn.conv2d方法 ( 附代码详解注释 )
最近在研究学习TensorFlow,在做识别手写数字的demo时,遇到了tf.nn.conv2d这个方法,查阅了官网的API 发现讲得比较简略,还是没理解.google了一下,参考了网上一些朋友写得博 ...
- tf.nn.embedding_lookup()的用法
函数: tf.nn.embedding_lookup( params, ids, partition_strategy='mod', name=None, validate_indices=True, ...
- tf.nn.relu
tf.nn.relu(features, name = None) 这个函数的作用是计算激活函数 relu,即 max(features, 0).即将矩阵中每行的非最大值置0. import tens ...
- tf.nn.l2_loss() 与 权重衰减(weight decay)
权重衰减(weight decay) L2正则化的目的就是为了让权重衰减到更小的值,在一定程度上减少模型过拟合的问题,所以权重衰减也叫L2正则化. L2正则化就是在代价函数后面再加上一个正则化 ...
最新文章
- ElasticSearch + xpack 使用
- Sublime Text(2/3)编译lua
- idea启动tomcat很慢_idea使用maven创建web项目
- 杂项-Java:JSP
- Cocos2d-x v3.1 坐标系统(五)
- 22行代码AC_Prime Number Aizu - 0009(素数筛)(解题报告)
- java通用日志记录_JAVA实现通用日志记录方法
- 参数php_干净的PHP代码-函数参数
- 【重大修改】动态时间规整(Dynamic Time Warping)
- 昨晚停网后,我写了一段Python代码破解了隔壁小姐姐的wifi密码,结果亮了!
- gp数据库中Appendonly与compresslevel
- 编程疑难杂症の真的非常一样的文本?!
- Microsoft.AlphaImageLoader滤镜解说
- 计算机网络怎样连手机软件,玩够了手机投屏?了解一下手机如何直接连智能电视...
- 关于知云文献翻译显示乱码,无法翻译的解决方法
- 热敏电阻制作温度传感器的c语言,NTC热敏电阻温度测量和控制系统.doc
- 工作绩效数据 工作绩效报告 偏差分析 变更控制流程 变更控制委员会
- AOPlog4j2propagation的7种事务配置
- 中国人保为易集康健康科技承保产品责任险,为消费者保驾护航!
- Neo4j技能树学习之路