【注】内容来自MOOC人工智能实践TensorFlow笔记课程第七讲第一课
https://www.icourse163.org/learn/PKU-1002536002?tid=1002700003#/learn/content?type=detail&id=1004087267&sm=1
一、全连接神经网络(FC)回顾
之前做过的手写数字识别mnist使用的是全连接神经网络。
- 全连接神经网络:每个神经元与前后相邻层的每一个神经元都有连接关系;输入是特征,输出是最终预测结果。
- 实际相比于手写数字图片,对于高分辨率的三通道彩色图像,待优化的参数过多,容易导致模型过拟合。
- 为了避免过拟合,往往不会将原始图片直接喂入全连接网络。实际应用中常常会对原始图像进行特征提取,提取到的特征再喂给全连接网络。
二、卷积神经网络(CNN)
1.卷积
- 卷积是一种有效提取图像特征的方法。
常用正方形卷积核,遍历图片上的每个点,一个点的例子如下: - 输出图片边长计算过程如下:
- 计算公式:
或:
注意不能整除时向上取整。
2.全零填充padding
- 在输入图片周围进行全零填充,以保证输出图片和输入的尺寸一致。
W:输入尺寸
F:卷积层尺寸
P:零填充的数量
S:步长
同样向上取整。
- TensorFlow中,使用padding用:
padding = 'SAME',不使用用:padding = 'VALID'
3.TensorFlow计算卷积
tf.nn.conv2d(
[batch, 5, 5, 1], # 输入描述:图片数,行,列,通道数
[3, 3, 1, 15], # 卷积核描述:行,列,通道数(=输入图片通道数),核个数(=卷积层输出通道数)
[1, 1, 1, 1], # 核滑动步长:固定1,横向滑动步长,纵向滑动步长,固定1
padding = 'VALID' # 使用padding用 'SAME',不使用 'VALID'
)
- 对多通道图片求卷积
卷积核的深度 = 输入图片通道数
如三通道输入,则卷积核三个分别对应一张图片的三个输入通道,则一张RGB图片与一个三通道卷积核作用得到一个输出,而这张RGB图对每个卷积核都会得到一个输出,即一张图片对应的输出通道数等于卷积核的个数。
4.池化pooling
- 通过卷积提取的特征仍然数据量很大,通过池化减少特征数量。
① 最大池化 ——提取图片纹理
② 均值池化——保留背景特征
# 最大池化
pool = tf.nn.max_pool(
[batch, 28, 28, 3], #输入:图片数,行分辨率,列分辨率,通道数
[1, 2, 2, 1], # 池化核(仅大小):固定1, 行分辨率,列分辨率,固定1
[1, 2, 2, 1], # 池化核滑动步长:固定1,横向滑动步长,纵向滑动步长,固定1
padding = 'SAME' # 使用padding用 'SAME',不使用 'VALID'
)
# 平均池化
pool = tf.nn.avg_pool(
[batch, 28, 28, 3], #输入:图片数,行分辨率,列分辨率,通道数
[1, 2, 2, 1], # 池化核(仅大小):固定1, 行分辨率,列分辨率,固定1
[1, 2, 2, 1], # 池化核滑动步长:固定1,横向滑动步长,纵向滑动步长,固定1
padding = 'SAME' # 使用padding用 'SAME',不使用 'VALID'
)
5.舍弃dropout
- 在训练神经网络时,一部分神经元以一定的概率被暂时舍弃。
- 使用神经网络时,恢复这些舍弃的神经元的连接。
- 可以有效减少过拟合。
- 常常在前向传播构建神经网络时,使用dropout来减小过拟合,加快模型的训练速度。
tf.nn.dropout(上层输出,暂时舍弃的概率)
dropout一般会放在全连接网络中,如上,参数训练过程中,有指定概率的神经元被随机置零,它们不参加当前轮的参数优化。
三、卷积神经网络和全连接神经网络的关系
- 卷积NN就是借助卷积操作,对输入图片进行特征提取,再把提取到的特征喂入全连接网络。
- CNN由两部分组成:
① 对原始输入图片进行特征提取(若干次卷积、**和池化);
② 将得到的特征信息喂入全连接神经网络。 - CNN经典结构:
Lenet-5
Alenet
VGGNet
GoogleNet
ResNet
网络结构均是以卷积、**、池化、全连接这4种操作为基础进行扩展。