Tensorflow 入门学习12.卷积神经网络原理2.(池化)

版权声明:(谢厂节的博客)博主文章绝大部分非原创,转载望留链接。 https://blog.csdn.net/xundh/article/details/82914813

本文学习内容来自《TensorFlow深度学习应用实践》《深度学习》

池化的概念

卷积网络中一个典型层包含三级。在第一级中,这一层并行地计算多个卷积产生一组线性激活响应。在第二级中,每一个线性激活响应将会通过一个非线性的激活函数,例如整流线性激活函数。这一级有时也被称为探测级(detector stage)。在第三级中,我们使用池化函数(pooling function)来进一步调整这一层的输出。

在通过卷积获得了特征(features)之后,下一步希望利用这些特征去做分类。理论上讲,人们可以用所有提取到的特征去训练分类器,如softmax分类器,但这样做计算量过大,并容易出现过拟合(over-fitting)。
这个问题的产生是由于卷积后的特征图像具有一种“静态性”的属性,这意味着在一个图像区域有用的特征极有可能在另一个区域同样适用。因此,为了描述大的图像,一个很自然的想法就是对不同位置的特征进行聚合统计,例如,特征提取可以计算图像一个区域上的某个特定的特征的平均值(或最大值)。这些概要统计特征不仅具有低得多的维度,同时还会改善结果(不容易过拟合)。这种聚合的操作就叫作池化(pooling),有时也称为平均池化或最大池化(取决于计算池化的方法)。

不管采用什么样的池化函数,当输入做出少量平移时,池化能够帮助输入的表示近似不变(invariant)。平移的不变性是指当我们对输入进行少量平移时,经过池化函数后的大多数输出并不会发生改变。局部平移不变性是一个很有用的性质,尤其是当我们关心某个特征是否出现而不关心它出现的具体位置时*。
使用池化可以看作增加了一个无限强的先验:这一层学得的函数必须具有对少量平移的不变性。当这个假设成立时,池化可以极大地提高网络的统计效率。
对空间区域进行池化产生了平移不变性,但当我们对分离参数的卷积的输出进行池化时,特征能够学得应该对于哪种变换具有不变性。

TensorFlow的max-pooling池化运算函数

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

max-pooling后的图片:
在这里插入图片描述

相应的,对于多个feature map,操作如下,原本64张224X224的图像,经过Max Pooling后,变成了64张112X112的图像,从而实现了downsampling的目的。
在这里插入图片描述

这里利用的就是:平移不变性(translation invariant)

除了Max Pooling,还有一些其它的池化操作,例如:SUM pooling、AVE pooling、MOP pooling、CROW pooling和RMAC pooling等

示例

import tensorflow as tf
data = tf.constant([
    [[3.0, 2.0, 3.0, 4.0],
     [2.0, 6.0, 2.0, 4.0],
     [1.0, 2.0, 1.0, 5.0],
     [4.0, 3.0, 2.0, 1.0]]
])

data = tf.reshape(data,[1, 4, 4, 1])
maxPooling = tf.nn.max_pool(data,[1, 2, 2, 1], [1, 2, 2, 1],padding="VALID")
with tf.Session() as sess:
    print(sess.run(maxPooling))

池化结果:

[[[[ 6.]
   [ 4.]]

  [[ 4.]
   [ 5.]]]]

使用池化运算加强卷积特征提取

import tensorflow as tf
import cv2
import numpy as np

img = cv2.imread("1.png")
img = np.array(img, dtype=np.float32)
x_image = tf.reshape(img, [1, 512, 512, 3])

filter = tf.Variable(tf.ones([7, 7, 3, 1]))
init = tf.global_variables_initializer()
with tf.Session() as sess:
    sess.run(init)
    res = tf.nn.conv2d(x_image, filter, strides=[1, 2, 2, 1], padding='SAME')
    res = tf.nn.max_pool(res,[1, 2, 2, 1], [1, 2, 2, 1], padding='VALID')  # 池化
    res_image = sess.run(tf.reshape(res, [128, 128])) / 128+1

cv2.imshow('source', img.astype('uint8'))
cv2.imshow("lena", res_image.astype('uint8'))
cv2.waitKey()

结果:
在这里插入图片描述

均值池化

tf.layers.average_pooling2d

参数类似于max_pooling函数的参数。

扫描二维码关注公众号,回复: 3877475 查看本文章

本文部分内容来自:
https://www.cnblogs.com/python-frog/p/9380290.html

猜你喜欢

转载自blog.csdn.net/xundh/article/details/82914813