4.2 Tensorflow笔记:池化函数

原创 2017年08月04日 01:16:22

池化

卷积神经网络的结构

卷积神经网络

其中,input为输入,conv为卷积层,由卷积核构成,pool为池层,由池化函数构成最后是全连接层与输出层,其负责对卷积层提取的特征进行处理以获得我们需要的结果

池化函数的意义

池化层的输入一般来源于上一个卷积层,主要作用是提供了很强的鲁棒性(例如max-pooling是取一小块区域中的最大值,此时若此区域中的其他值略有变化,或者图像稍有平移,pooling后的结果仍不变),并且减少了参数的数量,防止过拟合现象的发生,同时参数的减少对于计算而言也有一定的帮助。而又因为池化层一般没有参数,所以反向传播的时候,只需对输入参数求导,不需要进行权值更新。

池化层的前向计算

常用的池化函数有最大池化,平均池化,其前向计算十分简单,最大池化就是求最大值,平均池化就是求平均值.其效果如下:
1. 最大池化:tf.nn.avg_pool
maxpool
这里写图片描述
2.平均池化:tf.nn.max_pool
平均池化

池化层反向计算

池化层的反向传播根据池化函数的不同也有两种方式
1. 最大池化,将残差传递给原来最大值的位置,其他位置的值设置为零
最大池化的反向传播
2. 平均池化,按照原来每个数字对应的位置,取对应残差的平均值(残差 / 对应位置数组数量)填充即可
平均池化的反向传播

code

# - * - coding: utf - 8 -*-
import tensorflow as tf
import os
import numpy as np

os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'

#
input_data = tf.Variable(np.random.rand(10, 9, 9, 3), dtype=np.float32)
filter_data = tf.Variable(np.random.rand(2, 2, 3, 2), dtype=np.float32)
y = tf.nn.conv2d(input_data, filter_data, strides=[1, 1, 1, 1], padding='SAME')
print('0. tf.nn.conv2d : ', y)

# 计算池化区域中元素的平均值
output = tf.nn.avg_pool(value=y, ksize=[1, 2, 2, 1], strides=[1, 1, 1, 1], padding='SAME')
print('1. tf.nn.avg_pool : ', output)

# 计算池化区域中元素的最大值
output = tf.nn.max_pool(value=y, ksize=[1, 2, 2, 1], strides=[1, 1, 1, 1], padding='SAME')
print('2. tf.nn.max_pool : ', output)

# 计算池化区域中元素的最大值,与最大值所在位置
# 1.1.0似乎只支持GPU,本代码首测运行于 python3.6.2 + Tensorflow(CPU) 1.2.0 + win10
output, argmax = tf.nn.max_pool_with_argmax(input=y, ksize=[1, 2, 2, 1], strides=[1, 1, 1, 1], padding='SAME')
print('2.5 . tf.nn.max_pool : ', output, argmax)

# 与conv2d_transpose 二维反卷积类似
# 在解卷积网络(deconvolutional network) 中有时被称为'反卷积',但实际上是conv3d的转置,而不是实际的反卷积
input_data = tf.Variable(np.random.rand(1, 2, 5, 5, 1), dtype=np.float32)
filters = tf.Variable(np.random.rand(2, 3, 3, 1, 3), dtype=np.float32)
y = tf.nn.conv3d(input_data, filters, strides=[1, 2, 2, 1, 1], padding='SAME')
print('3. tf.nn.conv3d : ', y)

# 计算三维下池化区域中元素的平均值
output = tf.nn.avg_pool3d(input=y, ksize=[1, 1, 2, 2, 1], strides=[1, 2, 2, 1, 1], padding='SAME')
print('4. tf.nn.avg_pool3d : ', output)

# 计算三维下池化区域中元素的最大值
output = tf.nn.max_pool3d(input=y, ksize=[1, 1, 2, 2, 1], strides=[1, 2, 2, 1, 1], padding='SAME')
print('5. tf.nn.max_pool3d : ', output)

# 执行一个N维的池化操作
# def pool(input, window_shape,pooling_type,padding,dilation_rate=None,strides=None,name=None,data_format=None):

run

0. tf.nn.conv2d :  Tensor("Conv2D:0", shape=(10, 9, 9, 2), dtype=float32)
1. tf.nn.avg_pool :  Tensor("AvgPool:0", shape=(10, 9, 9, 2), dtype=float32)
2. tf.nn.max_pool :  Tensor("MaxPool:0", shape=(10, 9, 9, 2), dtype=float32)
2.5 . tf.nn.max_pool :  Tensor("MaxPoolWithArgmax:0", shape=(10, 9, 9, 2), dtype=float32) Tensor("MaxPoolWithArgmax:1", shape=(10, 9, 9, 2), dtype=int64)
3. tf.nn.conv3d :  Tensor("Conv3D:0", shape=(1, 1, 3, 5, 3), dtype=float32)
4. tf.nn.avg_pool3d :  Tensor("AvgPool3D:0", shape=(1, 1, 2, 5, 3), dtype=float32)
5. tf.nn.max_pool3d :  Tensor("MaxPool3D:0", shape=(1, 1, 2, 5, 3), dtype=float32)

参考文章

【1】 深度学习笔记5:池化层的实现

版权声明:欢迎转载,共同学习,但请尊重版权,标明出处:http://blog.csdn.net/fontthrone

TensorFlow学习(九):各种卷积网络

tensorflow的卷积网络手写体识别
  • xierhacker
  • xierhacker
  • 2017年01月02日 11:34
  • 4811

Tensorflow逐步讲解实现卷积神经

用tensorflow实现一个卷积神经网络,同时也介绍了卷积核和pooling参数的代表意思。...
  • yuzhou164
  • yuzhou164
  • 2017年03月14日 15:15
  • 549

TensorFlow strides 参数讨论

更详细地讨论见 stackoverflow:Tensorflow Strides Argument卷积神经网络(CNN)在 TensorFlow 实现时涉及的 tf.nn.con2d(二维卷积)、tf...
  • lanchunhui
  • lanchunhui
  • 2017年03月12日 11:48
  • 4065

Tensorflow之池化函数汇总

池化函数: 在神经网络中,池化函数一半都是跟在卷积函数的下一层,它们被定义在tensorflow-1.1.0/tensorflow/python/ops下的nn.py和gen_nn_ops.py文件...
  • zSean
  • zSean
  • 2017年09月07日 20:43
  • 642

tensorflow中的卷积和池化解释

首先,卷积和池化的基本概念就不用多说了,写这个东西的太多了,这里主要说说tensorflow中的相关内容。 再看看tensorflow中关于这两个函数的接口定义: tf.nn.conv2d( ...
  • sophia_xw
  • sophia_xw
  • 2017年04月19日 14:09
  • 1128

池化方法总结(Pooling)

在卷积神经网络中,我们经常会碰到池化操作,而池化层往往在卷积层后面,通过池化来降低卷积层输出的特征向量,同时改善结果(不易出现过拟合)。 为什么可以通过降低维度呢? 因为图像具有一种“静态性”的属性,...
  • Daniel_djf
  • Daniel_djf
  • 2015年01月05日 21:27
  • 21246

深度学习笔记5:池化层的实现

池化层的推导 池化层的输入一般来源于上一个卷积层,主要作用是引入不变性,并且减少了冗余。池化层一般没有参数,所以反向传播的时候,只需对输入参数求导,不需要进行权值更新。 池化层的前向计算 前向计...
  • l691899397
  • l691899397
  • 2016年08月19日 14:01
  • 14198

池化方法总结(Pooling) 和卷积 。 第三部分讲的很好

池化方法总结(Pooling) 2016-01-12 22:55 5033人阅读 评论(2) 收藏 举报  分类: deep learning(18)  ...
  • kebu12345678
  • kebu12345678
  • 2017年02月08日 09:41
  • 4200

【TensorFlow】tf.nn.max_pool实现池化操作

max pooling是CNN当中的最大值池化操作,其实用法和卷积很类似 有些地方可以从卷积去参考【TensorFlow】tf.nn.conv2d是怎样实现卷积的?  tf.nn.max_pool(...
  • mao_xiao_feng
  • mao_xiao_feng
  • 2016年12月04日 14:28
  • 22648

TensorFlow 最大池化

TensorFlow 最大池化 由 Aphex34 (自己的作品) CC BY-SA 4.0, 通过 Wikimedi...
  • sinat_32547403
  • sinat_32547403
  • 2017年07月10日 22:25
  • 1347
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:4.2 Tensorflow笔记:池化函数
举报原因:
原因补充:

(最多只允许输入30个字)