课程:吴恩达深度学习
计算机视觉(p108-p150)
卷积网络
- 补充:超参数
- 机器学习模型中一般有两类参数:一类需要从数据中学习和估计得到,称为模型参数(Parameter)—即模型本身的参数。比如,线性回归直线的加权系数(斜率)及其偏差项(截距)都是模型参数。还有一类则是机器学习算法中的调优参数(tuning parameters),需要人为设定,称为超参数(Hyperparameter)。比如,正则化系数λ,决策树模型中树的深度。
- 参数和超参数的区别:模型参数是模型内部的配置变量,需要用数据估计模型参数的值;模型超参数是模型外部的配置,需要手动设置超参数的值。机器学习中一直说的“调参”,实际上不是调“参数”,而是调“超参数”。
- 哪些属于超参数?
梯度下降法中的学习速率α,迭代次数epoch,批量大小batch-size,k近邻法中的k(最相近的点的个数),决策树模型中树的深度,等等。 - 超参数的优化:
有四种主要的策略可用于搜索最佳配置:- 照看(babysitting,又叫试错)
- 网格搜索
- 随机搜索
- 贝叶斯优化
- 边缘检测示例:
- 注意所采用filter的样式,如垂直边缘检测一般采用的数字组合 [ 1 0 − 1 1 0 − 1 1 0 − 1 ] \begin{bmatrix} 1& 0& -1 \\1& 0& -1 \\1& 0& -1 \end{bmatrix} ⎣⎡111000−1−1−1⎦⎤; Sobel过滤器 [ 1 0 − 1 2 0 − 2 1 0 − 1 ] \begin{bmatrix} 1& 0& -1 \\2& 0& -2 \\1& 0& -1 \end{bmatrix} ⎣⎡121000−1−2−1⎦⎤,它的优点在于增加了中间一行元素的权重,这使得结果的鲁棒性会更高一些; Scharr过滤器 [ 3 0 − 3 10 0 − 10 3 0 − 3 ] \begin{bmatrix} 3& 0& -3 \\10& 0& -10 \\3& 0& -3 \end{bmatrix} ⎣⎡3103000−3−10−3⎦⎤。
- 一种思想:9个数字当成参数,使用反向传播去让神经网络学习这9个数字。
- 卷积操作——padding:
- 如果我们有一个 n × n n \times n n×n的图像,用 f × f f \times f f×f 的过滤器做卷积,那么输出的维度就是 ( n − f + 1 ) × ( n − f + 1 ) ( n − f + 1 ) \times ( n − f + 1 ) (n−f+1)×(n−f+1)。
- padding解决每一步输出缩小和图像边缘的大部分信息丢失问题
- padding:卷积操作之前对图像进行像素值为p的填充,则输出为 ( n + 2 p − f + 1 ) × ( n + 2 p − f + 1 ) ( n + 2 p − f + 1 ) \times ( n + 2 p − f + 1 ) (n+2p−f+1)×(n+2p−f+1)。
- 选择填充多少像素,通常有两个选择,分别叫做Valid卷积和Same卷积:Valid卷积意味着不填充,Same卷积意味着填充后,输出大小和输入大小相同。
- 卷积步长 (Strided Convolutions):
- 再加入卷积步长s后,输出维度计算式为: ⌊ n + 2 p − f s + 1 ⌋ × ⌊ n + 2 p − f s + 1 ⌋ \left \lfloor\frac{n + 2p - f}{s} + 1\right \rfloor \times \left \lfloor\frac{n + 2p - f}{s} + 1\right \rfloor ⌊sn+2p−f+1⌋×⌊sn+2p−f+1⌋
- 注意:关于互相关和卷积的技术上理解,取决于数学教材or信号处理教材数学教科书,数学教科书上卷积的定义是过滤器镜像翻转(沿矩阵右上斜线),再元素乘积求和;按照机器学习的惯例,通常不进行翻转操作。从技术上说,这个操作可能叫做互相关更合适,但在深度学习文献中,按照惯例,我们将这(不进行翻转操作)也叫做卷积操作。
- 三维卷积 (Convolutions Over Volumes):
- 原图像: n × n × c h a n n e l s n \times n \times channels n×n×channels
- filter: f × f × c h a n n e l s f \times f \times channels f×f×channels(这两个通道数完全一样)
- output: ⌊ n + 2 p − f s + 1 ⌋ × ⌊ n + 2 p − f s + 1 ⌋ × 1 \left \lfloor\frac{n + 2p - f}{s} + 1\right \rfloor \times \left \lfloor\frac{n + 2p - f}{s} + 1\right \rfloor \times 1 ⌊sn+2p−f+1⌋×⌊sn+2p−f+1⌋×1
- 单层卷积网络 (One Layer of a Convolutional Network):
- 原图像-> 多个不同的filter进行卷积得到多个输出-> 不同输出层增加各自的bias,再应用非线性激活函数得到输出结果-> (对应同一阶段的)输出层堆叠起来-> 最终得到 ⌊ n + 2 p − f s + 1 ⌋ × ⌊ n + 2 p − f s + 1 ⌋ × n f i l t e r \left \lfloor\frac{n + 2p - f}{s} + 1\right \rfloor \times \left \lfloor\frac{n + 2p - f}{s} + 1\right \rfloor \times n_{filter} ⌊sn+2p−f+1⌋×⌊sn+2p−f+1⌋×nfilter的矩阵
- 过滤器用 W [ ? ] {W}^{[?]} W[?]表示,原始输入为 a [ 0 ] {a}^{[0]} a[0]。(表示法完全类似于之前logistic逻辑回归内容所讲)
- 应用偏差和非线性函数之后,这一层的输出等于它的激活值 a [ l ] {a}^{[l]} a[l](即 n H [ l ] × n W [ l ] × n c [ l ] {n}_{H}^{[l]} \times {n}_{W}^{[l]} \times {n}_{c}^{[l]} nH[l]×nW[l]×nc[l])当你执行批量梯度下降或小批量梯度下降时,如果有 m 个例子,就是有 m 个激活值的集合,那么输出 A [ l ] = m × n H [ l ] × n W [ l ] × n c [ l ] {A}^{[l]} = m \times {n}_{H}^{[l]} \times {n}_{W}^{[l]} \times {n}_{c}^{[l]} A[l]=m×nH[l]×nW[l]×nc[l]。
- 参数W为所有过滤器的集合再乘以过滤器的总数量: f [ l ] × f [ l ] × n c [ l − 1 ] × n c [ l ] {f}^{[l]} \times {f}^{[l]} \times {n}_{c}^{[l - 1]} \times {n}_{c}^{[l]} f[l]×f[l]×nc[l−1]×nc[l]。
- 池化层 (Pooling Layers):除了卷积层,卷积网络也经常使用池化层来缩减模型的大小,提高计算速度,同时提高所提取特征的鲁棒性
- max pooling
- average pooling
- 使用卷积的优点:和只用全连接层相比,卷积层的两个主要优势在于参数共享和稀疏连接
- 参数共享:观察发现,特征检测如垂直边缘检测如果适用于图片的某个区域,那么它也可能适用于图片的其他区域
- 稀疏连接:输出的某个像素值只取决于与filter相同大小的输入区域的像素值情况,其它像素值都不会对输出产生任影响。
经典网络
- 几个经典的神经网络结构:
详见:https://blog.csdn.net/weixin_36815313/article/details/105778993- LeNet-5:valid卷积-平均池化-valid卷积-平均池化-全连接层-全连接层-softmax输出
(此中使用的是sigmod函数和tanh函数,这种网络结构的特别之处在于各网络层之间有关联) - AlexNet:valid卷积-最大池化-same卷积-最大池化-再连续三次same卷积-最大池化-连续两个全连接层-softmax输出
(AlexNet比LeNet表现更为出色的另一个原因是它使用了ReLu激活函数) - VGGNet:
(VGG-16的这个数字16,就是指在这个网络中包含16个卷积层和全连接层。确实是个很大的网络,总共包含约1.38亿个参数,即便以现在的标准来看都算是非常大的网络。但VGG-16的结构并不复杂,而且这种网络结构很规整,都是几个卷积层后面跟着可以压缩图像大小的池化层,池化层缩小图像的高度和宽度。同时,卷积层的过滤器数量变化存在一定的规律,由64翻倍变成128,再到256和512。作者可能认为512已经足够大了,所以后面的层就不再翻倍了。无论如何,每一步都进行翻倍,或者说在每一组卷积层进行过滤器翻倍操作,正是设计此种网络结构的另一个简单原则。这种相对一致的网络结构对研究者很有吸引力,而它的主要缺点是需要训练的特征数量非常巨大。)
- LeNet-5:valid卷积-平均池化-valid卷积-平均池化-全连接层-全连接层-softmax输出
- 残差网络 (Residual Networks (ResNets)):
- 非常非常深的神经网络是很难训练的,因为存在梯度消失和梯度爆炸问题。跳跃连接(Skip connection)可以从某一层网络层获取激活,然后迅速反馈给另外一层,甚至是神经网络的更深层。可以利用跳跃连接构建能够训练深度网络的ResNets。
如果我们使用标准优化算法训练一个普通网络,比如说梯度下降法,或者其它热门的优化算法。如果没有残差,没有这些捷径或者跳跃连接,凭经验你会发现随着网络深度的加深,训练错误会先减少,然后增多。而理论上,随着网络深度的加深,应该训练得越来越好才对。但实际上,如果没有残差网络,对于一个普通网络来说,深度越深意味着用优化算法越难训练,随着网络深度的加深,训练错误会越来越多。
但有了ResNets就不一样了,即使网络再深,训练的表现却不错,比如说训练误差减少。这种方式确实有助于解决梯度消失和梯度爆炸问题,让我们在训练更深网络的同时,又能保证良好的性能。也许从另外一个角度来看,随着网络越来深,网络连接会变得臃肿,但是ResNet确实在训练深度网络方面非常有效。 - 残差块(Residual block)
- 残差块插入的时机是在线性激活之后,ReLU激活之前。
- “跳跃连接”,就是指 a [ l ] {a}^{[l]} a[l]跳过一层或者好几层,从而将信息传递到神经网络的更深层(之所以能实现跳跃连接是因为same卷积保留了维度)。
- 不太理解resnets不影响网络表现的原因:https://blog.csdn.net/weixin_36815313/article/details/105779620
- 残差网络起作用的主要原因是这些残差块学习恒等函数非常容易
- 普通网络和ResNets网络常用的结构是:卷积层-卷积层-卷积层-池化层-卷积层-卷积层-卷积层-池化层……依此重复。直到最后,有一个通过softmax进行预测的全连接层。
- 非常非常深的神经网络是很难训练的,因为存在梯度消失和梯度爆炸问题。跳跃连接(Skip connection)可以从某一层网络层获取激活,然后迅速反馈给另外一层,甚至是神经网络的更深层。可以利用跳跃连接构建能够训练深度网络的ResNets。
- 网络中的卷积及1x1卷积 (Network in Network and 1x1 Convolutions):
- 1×1卷积可以压缩通道数量(当然也可保持或增加)并减少计算
- 谷歌 Inception 网络简介 (Google Inception Network Motivation):
- Inception模块:使输出与输入长宽维度相同的,多种不同的过滤器( 1 ∗ 1 , 3 ∗ 3 , 5 ∗ 5 1*1,3*3,5*5 1∗1,3∗3,5∗5,max pooling)进行计算后,将各自的输出堆叠起来形成该模块。
- Inception网络不需要人为决定使用哪个过滤器或者是否需要池化,而是由网络自行确定这些参数,你可以给网络添加这些参数的所有可能值,然后把这些输出连接起来,让网络自己学习它需要什么样的参数,采用哪些过滤器组合。
- 如果你在构建神经网络层的时候,不想决定池化层是使用1×1,3×3还是5×5的过滤器,那么Inception模块就是最好的选择。我们可以应用各种类型的过滤器,只需要把输出连接起来。
- 计算成本问题:通过使用1×1卷积来构建瓶颈层,从而大大降低计算成本(先利用1*1卷积缩小网络,再用其它filter扩大网络,只要合理构建瓶颈层,既可以显著缩小表示层规模,又不会降低网络性能,从而节省了计算)。
- 以上内容结合构建inception网络详见:https://blog.csdn.net/weixin_36815313/article/details/105780151
- Inception网络的一个细节,它确保了即便是隐藏单元和中间层也参与了特征计算,它们也能预测图片的分类,在Inception网络中,起到一种调整的效果,并且能防止网络发生过拟合。