用途:
挑战:需要的数据量大:
为了能够处理大图,必须使用卷积。
上图中,为3 × × 3的过滤器(filter,又叫核,kernel);
用 ∗ ∗ 表示卷积运算(convolution)。
卷积为:用filter和矩阵的第一个3 × × 3部分的元素相乘再相加,然后filter右移一列,相乘再相加。。。到矩阵最右端后下移一行,重复上述操作。最后卷积的结果为一个4 × × 4的矩阵。
上图所使用的过滤器(卷积核)为垂直边缘检测器。
在tensorflow中,卷积为tf.nn.conv2d
。
在Keras中,卷积为Conv2D
。
这就是垂直边缘检测器。通过该卷积核,卷积出图像的垂直边缘轮廓。
如果图像为1000 × × 1000的,那么卷积出来的轮廓图像为998 × × 998。
该卷积核(垂直边缘检测器)可以区分明暗,即图像是由明转暗,还是由暗转明。
上图,垂直边缘检测器翻转,得到水平边缘检测器。
Sobel 边缘检测器,增加了中间一行元素的权重,使得结果鲁棒性更好。
Scharr滤波器。
随着深度学习的发展,当需要坚检测出复杂图像的边缘,不一定非要使用类似上边介绍的这九个数字,但可以从这些前人成果中获益。
即,把9个数字作为参数,使用反向传播算法,让神经网络来理解这九个数字。最后得到一个出色的边缘检测器。
使用神经网络能够学习任何改网络所需要的 3×3 3 × 3 滤波器,并在整幅图上使用该滤波器,检测出图像的边缘。
思想:将滤波器的九个数字作为神经网络的参数来训练。
一个 n×n n × n 的图像和一个 f×f f × f 的图像卷积后的结果是一个 (n−f+1)×(n−f+1) ( n − f + 1 ) × ( n − f + 1 ) 的图像。
这样卷积的缺点:
解决办法:填充图像(Padding)。
一般用 0 0 填充。
一个图像的上下左右都填充,每个边填充 p p 行(列),那么,最后的卷积结果变成了 (n+2p−f+1)×(n+2p−f+1) ( n + 2 p − f + 1 ) × ( n + 2 p − f + 1 ) 。
比如,在 6×6 6 × 6 的图像周围在加一层像素点,变成 8×8 8 × 8 。这样, 3×3 3 × 3 卷积核的结果是 6×6 6 × 6 。
现在存在两种卷积:不padding的卷积和padding的卷积:
卷积的步长不一定是1。
一个步长为 s s 的卷积的结果如下:
数学意义上的卷积,需要先进行翻转,之后再互相关。深度学习没有翻转,只有互相关。但深度学习领域,习惯上,将这种互相关称之为卷积。
使用的都是 ∗ ∗ 符号。
卷积核的通道数 = 图像的通道数;
卷积的结果为二维矩阵。
卷积核还是在二维平面上按照既定步长移动,只不过变成立方体内部数据相乘再相加。
n×n×nc ∗ f×f×nc−−>⌊n+2p−fs+1⌋×⌊n+2p−fs+1⌋×n′c n × n × n c ∗ f × f × n c − − > ⌊ n + 2 p − f s + 1 ⌋ × ⌊ n + 2 p − f s + 1 ⌋ × n c ′
其中, nc n c 为通道数; n′c n c ′ 为卷积核的个数。
图像的通道数(channels)也叫做3维立方体的深度(depth)。
使用不同的卷积核,比如上图使用垂直边缘检测器和水平边缘检测器,识别图像的不同特征。
如何构建神经网络的卷积层?
卷积层的参数 w w 是过滤器的参数。那么,卷积层的参数个数仅由过滤器的size和过滤器个数影响。比如,卷积层有10个3 × × 3 × × 3的过滤器,那么卷积层就是280个参数。不管输入的图像有多大,都是这280个参数。这就是卷积神经网络的一个特征,叫做“避免过拟合”。
注: A[l]:m×n[l]H×n[l]W×n[l]c A [ l ] : m × n H [ l ] × n W [ l ] × n c [ l ] 的顺序仅为吴恩达的顺序,并不是同一标准。也有人喜欢将通道放在最前。
再注:以上标记法也仅为吴恩达标记的方式,在今天,深度学习领域还没有达成一致的标记法。
卷积结束后展开成一个向量,给到逻辑回归,判断是否为猫。
可以看到,随着一层一层的卷积,输出的数据大小在不断的减小,但是信道数量在不断的增加。
确定超参数 f[l]、p[l]、s[l]、n[l]c f [ l ] 、 p [ l ] 、 s [ l ] 、 n c [ l ] 是一件费功夫的事情。
一个典型的卷积神经网络有:
作用:
输入是某些特征的集合。数字大(9)可能意味着提取了某个特定特征。其他的地方没有这个特征。最大化操作的功能就是只要在任何一个框(图中有四个框)内提取到某个特征。它都会保留到最大池化的输出中。
最大池化作用的一种理解:如果在过滤器中提取到某个特征,那么保留其最大值。如果没有提取到这个特征,那么最大池化保留的结果也很小。
使用最大池化的原因:在很多实验中效果很好。
最大池化的操作是分别对每个信道单独执行的。
比如输入的图像有两个信道,那么分别对两个信道做最大池化。
池化的输出是 ⌊n+2p−fs+1⌋×⌊n+2p−fs+1⌋×nc ⌊ n + 2 p − f s + 1 ⌋ × ⌊ n + 2 p − f s + 1 ⌋ × n c 。
其中, nc n c 是输入的信道数。
注意:卷积的输出信道数 n′c n c ′ = 过滤器的个数。池化的输出信道数 = 输入的信道数。
nc n c 个信道中的每一个信道都是单独地执行最大池化。
类似最大池化,最大池化选择最大值,平均池化将窗口内的所有值求平均。
最大池化比平均池更常用。
超参数:
常见的参数为 f f =2, s s =2,效果是高度和宽度减半。
也有 f f =3, s s =2。
超参数 p p 很少使用,即 p=0 p = 0 。
则:
输入: nH×nW×nc n H × n W × n c ;
输出: ⌊nH−fs+1⌋×⌊nW−fs+1⌋×nc ⌊ n H − f s + 1 ⌋ × ⌊ n W − f s + 1 ⌋ × n c 。
池化没有需要学习的参数。池化只是静态属性。
存在两种计算神经网络层数的方式。
吴恩达采用第一种方式。这种方式,在统计神经网络的层数时,可以只统计具有权重和参数的层(池化层没有权重和参数,只有超参数)。
关于超参数选择的常规做法:
尽量不要知己设置超参数;查看文献,看别人采用了哪些超参数;选择一个在别人的任务中效果很好的架构。那么这个架构也有可能使用与自己的应用程序。
随着神经网络深度的加深,高度 nH n H 、宽度 nW n W 通常都会减小,信道数会增加。
神经网络的一种模式:
conv(一层或多层)- pool - conv - pool - FC - FC - FC - Softmax 。
修正:
CONV1的parameters应该为608(5 X 5 X 3 X 8 + 8);
CONV2的parameters应该为3216(5 X 5 X 8 X 16 + 16)。
结论:
和只用全连接层(FC)相比,卷积层的两个主要优势:
通过这两种机制,神经网络减少了大量参数。以便于我们用更小的训练集来训练它,从而预测过拟合。
CNN具有平移不变属性。比如图像向有移动几个像素,仍然能够识别。因为神经网络的卷积结构即使移动几个像素,这张图像依然具有非常相似的特征,应该属于同样的输出标记。