深度学习:算法到实战笔记03——卷积神经网络
绪论
1.卷积神经网络的应用
无处不在的卷积神经网络——基本应用
分类
检索
检测
分割
人脸验证
人脸识别
识别遗传病(准确率达91%)
人脸表情识别
图像生成
图像风格转化
自动驾驶
2.传统神经网络VS卷积神经网络
深度学习三部曲
Step1:搭建神经网络结构
Step2:找到一个合适的损失函数(交叉熵损失,均方误差)
Step3:找到一个合适的优化函数,更新参数(反向传播(BP),随机梯度下降(SGD))
损失函数
重点:1.损失函数是用来衡量吻合度的
~~~~~~~~~
2.可以调整参数/权重W,使得映射的结果和实际类别吻合
~~~~~~~~~
3.常用分类损失、常用回归损失(常用于求取值连续的情况)
大致流程:计算损失->优化
全连接网络处理图像问题
参数太多:权重矩阵的参数太多——>过拟合
过度的拟合了训练集中的一些特征导致泛化性差。
卷积网络的解决方式
局部关联,参数共享
相同之处
卷积神经网络沿用了传统神经网络的层级结构。
基本组成结构
1.卷积
一维卷积
一维卷积经常用在信号处理中,用于计算信号的延迟累积。
例如
此处的 f=[f1,f2,f3] 被称为滤波器(filter)或卷积核(convolutional kernel)。
设滤波器f长度为m,它和一个信号序列x=[x1,x2,x3,…]的卷积记为
卷积是什么?
卷积是对两个实变函数的一种数学操作。
二维卷积
在图像处理中,图像是以二维矩阵的形式输入到神经网络的,因此我们需要二维卷积。
下图所示即二维卷积计算方法:
得到如下公式:
卷积中涉及的基本概念
input:输入,即输入的二维矩阵
kernel/filter:卷积核/滤波器
weights:权重,卷积核里的每一个值,如:w,x,…
图中蓝色边框区域即感受野
receptive field:感受野,卷积核进行一次卷积所对应的输入上的一块区域
stride:步长
以步长为1举例:
步长为1即下一次感受野区域向左移一步(或一列)
走到边界后改为向下走一步(即换下一行首列得到对应感受野)
针对上图,当步长为3时,就会出现大小不匹配的情况,这就需要进行填充
padding:填充,一般用0来填充
更多内容:
图中紫色边框区域即特征图
activation map 或 feature map:特征图,卷积输出的结果
如果输入二维矩阵的大小为NN,Filter的大小为FF,则输出的特征图的大小为:
(N - F)/ stride + 1(未加padding)
有padding时输出的特征图大小为:
(N + padding * 2 - F)/ stride + 1
depth/channel:深度,特征图的厚度,和filter的个数保持一致(注意:看的是filter的个数,而不是输入的图的维度或者通道数)
output:输出,例如分类任务中输出每个类别的概率
2.池化(Pooling)
池化过程更像是在做缩放的过程
保留了主要特征的同时减少参数和计算量,防止过拟合,提高模型泛化能力。
一般处于卷积层与卷积层之间,全连接层与全连接层之间。
池化(Pooling)类型:
Max pooling:最大值池化
Average pooling:平均池化
在分类中,最大值池化更加常用。
3.全连接(Fully Connected Layer)
全连接层/FC layer:
· 两层之间所有神经元都有权重链接
· 通常全连接层在卷积神经网络尾部
· 全连接层参数量通常最大
小结
卷积神经网络典型结构
1.AlexNet
Relu的优点:
· 解决了梯度消失问题(在正区间)
· 计算速度特别快,只需要判断输入是否大于0
· 收敛速度远快于sigmoid
DropOut(随机失活):训练时随机关闭部分神经元测试时整合所有神经元。
AlexNet分层解析
可以看出全连接层的参数数量很大
2.ZFNet
3.VGG
VGG是一个更深网络
深度从ALexNet的8层加深到了16-19层
到今天还是有很多人在用的网络结构
参数量大约是AlexNet的两倍
4.GoogleNet
网络结构:
· 网络包含22个带参数的层(如果考虑pooling层就是27层),独立成块的层总共有约100个;
· 参数量大概是Alexnet的1/12
· 没有FC层
Inception模块
初衷:多卷积核增加特征多样性
在深度上串联
缺点:计算量大,计算复杂
解决思路:插入11卷积核进行降维
例如:
Inception V3 进一步对V2的参数数量进行降低
用小的卷积核替代大的卷积核
认为55的卷积核经过两个33的卷积核卷积,就会得到词汇表输出,和55的卷积核进行一个卷积所对应的感受野的大小是一样的。
好处:
降低参数量
增加非线性激活函数:数据表征能力更强,训练更快。
前面Stem部分(stem network):卷积——池化——卷积——卷积——池化
画框部分是两个辅助分类器:解决由于模型深度过深导致的梯度消失的问题。
5.ResNet
残差学习网络(deep residual learning network)
错误率从6.7%降低到3.57%
深度有152层
通过给导数+1解决了梯度消失问题
代码实战
MNIST 数据集分类:构建简单的CNN对 mnist 数据集进行分类。同时,还会在实验中学习池化与卷积操作的基本作用。链接:https://github.com/OUCTheoryGroup/colab_demo/blob/master/05_01_ConvNet.ipynb
CIFAR10 数据集分类:使用 CNN 对 CIFAR10 数据集进行分类,链接:https://github.com/OUCTheoryGroup/colab_demo/blob/master/05_02_CNN_CIFAR10.ipynb
使用 VGG16 对 CIFAR10 分类,链接:https://github.com/OUCTheoryGroup/colab_demo/blob/master/05_03_VGG_CIFAR10.ipynb