写在前面
回顾上一节课,我们明白,每个神经元做的工作就是 Wx+b , 那么每个神经元的W的尺寸就是:
卷积核尺寸*图像深度。
文章目录
卷积网络的结构
与常规的神经网络不同,ConvNet的神经元是三维排列的。
输入层
卷积层
非线性变换层
池化层
全连接层,就是普通的神经网络,输出层,隐含层,输出层
常见名词
- 感受野receptive field: 卷积核尺寸
- 局部连接
- 参数共享
- feature map = filter = neuron
- Sride 步长
卷积操作后,图像尺寸减小,假设卷积模板F * F,输入图像尺寸N*N,则输出尺寸**(N-F)/Stride + 1**,当然必须为整数,不然说明卷积核尺寸有问题。
- 神经元参数个数,即权重矩阵W的元素个数
假设A个F * F卷积核,输入图像RGB三通道,则参数个数为 F * F * 3 *A
- 卷积层输出尺寸(0 padding)
((N-F)/Stride + 1) * ((N-F)/Stride + 1) * A
- 卷积层输出尺寸(P padding)
((N-F+2P)/Stride + 1) * ((N-F+2P)/Stride + 1) * A
卷积层输出体积不考虑通道数,输出的深度是卷积核个数;但是神经元参数是把通道数考虑进去的
池化操作Pool Operation
池化操作是周期地在连接的池化层之间插入池化层,以渐进地(progressively)减少空间尺寸、参数数量、计算量,因此也控制了overfitting。
池化层不会改变通道数量,只会改变长和宽
Layer Patterns
最后一个卷积层和第一个全连接层之间占据了整个net的大部分参数,参数个数为13x13x256x4096。因此,在conv5和fc6之间会加一个最大池化层,且最大化池化层为13x13, 这样conv5经过 13x13 池化层之后,输出1x1x256,然后再和全连接层fc6连接。 ——这叫全局池化层
fc6 fc7 fc8 就是普通的神经网络,fc6是输入层,fc7是隐含层,fc8是输出层。fc6可以认为是5个卷积层提取完卷积特征输出的结果。前面5个卷积层就是在做 特征提取feature extraction
如果卷积层做的特别好,那么全连接层可以换成SVM,效果也可以。
可以这么看,深度卷积神经网络前半部分在做卷积层的特征提取,后面在做分类器
Problem Analysis
当模型参数数量远远小于样本数量时,我们可能产生overfitting。
迁移学习 Transfer Learning
迁移学习,即微调fine-tune 预训练网络的权重Pretrained weights
当目标任务和源任务比较接近时,数据量比较小时。可以选择迁移学习。
比如我们原始训练的模型分1000类,现在分10类。迁移学习方式:
-
把最后一层换掉,训练最后一层
-
往前推,训练最后两层
-
往前推,训练最后三层
…
n. 直至训练整个网络
Code
- 设置参数
- 建立网络,包括Pretrained weights,然后更改最后一层
- 数据扩增
- 训练集会做数据扩增
- 验证集一般不会做数据扩增,不然不知道结果的好坏是由参数的原因还是验证集的变化引起的。
- 网络训练
包括样本数、轮次
Trick
- Average Multiple Testing Results with a Single Model
比如对一张测试图片输出结果是一头牛,那么将这张图片旋转后我们还是希望结果是一头牛。所以,测试多张变换后的图片,看看大多数的结果是哪个,把多次结果的平均作为最终结果。 - 交叉验证
把训练数据随机打乱,取一份作为测试集。
比如下面训练5个模型,相当于有5个人帮你指认结果,更加准确。
- 用不同的训练参数。数据增强,初始化等等。
- 可以结合Trick1和Trick2,既用数据扩增对一张验证图片做10次测试,也用交叉验证训练5个模型,那么就有50个结果。相当于有50个人帮你指认。