本文是《TensorFlow从浅入深》系列之第12篇
TensorFlow从浅入深系列之一 -- 教你如何设置学习率(指数衰减法)
TensorFlow从浅入深系列之二 -- 教你通过思维导图深度理解深层神经网络
TensorFlow从浅入深系列之三 -- 教你如何对MNIST手写识别
TensorFlow从浅入深系列之四 -- 教你深入理解过拟合问题(正则化)
TensorFlow从浅入深系列之五 -- 教你详解滑动平均模型
TensorFlow从浅入深系列之六 -- 教你深入理解经典损失函数(交叉熵、均方误差)
TensorFlow从浅入深系列之七 -- 教你使用验证数据集判断模型效果
TensorFlow从浅入深系列之八 -- 教你学会变量管理
TensorFlow从浅入深系列之九 -- 教你认识图像识别中经典数据集
TensorFlow从浅入深系列之十 -- 教你认识卷积神经网络的基本网路结构及其与全连接神经网络的差异
TensorFlow从浅入深系列之十一 -- 教你深入理解卷积神经网络中的卷积层
池化层在两个卷积层之间,可以有效的缩小矩阵的尺寸(也可以减小矩阵深度,但实践中一般不会这样使用),co。池从而减少最后全连接层中的参数。
池化层既可以加快计算速度也可以防止过度拟合问题的作用。
池化层也是通过一个类似过滤器结构完成的,计算方式有两种:
- 最大池化层:采用最大值操作计算的池化层
- 平均池化层:使用平均值操作计算的池化层
池化层的过滤器也需要人工设定过滤器的尺寸、是否使用全0填充以及过滤器移动的步长等设置。
过滤器只影响一个深度上的节点,所以它需要在深度这个维度移动,这一点与卷积层不同,卷积层的过滤器是横跨整个深度的。
图6-14展示了一个最大池化层的过程:
下边例子是TensorFlow程序实现最大池化层:
# TF.nn.max_pool()实现了最大池化层,参数和tf.nn.conv2d类似
# ksize提供了过滤器的尺寸,strides提供了步长信息,padding提供了是否使用全0填充。
pool = tf.nn.max_pool(actived_conv, ksize = [1, 3, 3, 1], strides = [1, 2, 2, 1], padding = 'SAME')
第一个参数输入当前层的节点矩阵,这个矩阵是一个思维矩阵。
第二个参数过滤器(ksize)的尺寸是一个长度为4的一维数组,但是这个数组的第一个和最后一数必须为1。这意味着池化层的过滤器是不可以跨不同输入样例或者节点矩阵深度的。实际应用中,使用最多的过滤器尺寸为[1, 2, 2, 1]或者[1, 3, 3, 1]。
第三个参数strides步长,和tf.nn.conv2d函数中步长意义相同,第一维和最后一维也只能为1。
第四个参数padding表示是否用qu全0填充,'VALID'表示不填充,'SAME'表示用0填充
TensorFlow还提供了tf.nn.avg_pool()来实现平均池化层。tf.nn.avg_pool函数的调用格式和tf.nn.max_pool函数是一致的。