卷积神经网络,随着层数的增加,捕捉的区域更大,特征更加复杂,从边缘到纹理再到具体物体。
机器视觉(Computer Vision)是深度学习应用的主要方向之一。一般的CV问题包括以下三类:
- 图片识别
- 目标检测
- 图片风格迁移
如果图片尺寸较大,普通神经网络输入层的维度,网络权重W非常庞大
- 神经网络结构复杂,数据量相对不够,容易出现过拟合;
- 所需内存、计算量较大
卷积层计算
神经网络由浅层到深层,分别可以检测出图片的边缘特征 、局部特征(例如眼睛、鼻子等)、整体面部轮廓。
图片边缘有两类:
- 垂直边缘(vertical edges)
- 水平边缘(horizontal edges)
图片的边缘检测可以通过与相应滤波器进行卷积来实现
卷积层计算过程
input中与filter相同size的矩阵,对应格相乘得到的结果再相加得到output,通过filter不断移动step=1,获得完整output
卷积用conv_forward()表示;tensorflow中,卷积用tf.nn.conv2d()表示;keras中,卷积用Conv2D()表示。
边缘检测example
filter的数值一般需要通过模型训练得到,类似于标准神经网络中的权重W一样由梯度下降算法反复迭代求得。 CNN的主要目的就是计算出这些filter的数值。确定得到了这些filter后,CNN浅层网络也就实现了对图片所有边缘特征的检测。
padding
原始图片尺寸为n x n,filter尺寸为f x f,则卷积后的图片尺寸为(n-f+1) x (n-f+1),注意f一般为奇数。
- 卷积运算后,输出图片尺寸缩小
- 原始图片边缘信息对输出贡献得少,输出图片丢失边缘信息
为了解决图片缩小的问题,可以使用padding方法,即把原始图片尺寸进行扩展,扩展区域补零,用p来表示每个方向扩展的宽度。 经过padding之后,原始图片尺寸为(n+2p) x (n+2p),filter尺寸为f x f,则卷积后的图片尺寸为(n+2p-f+1) x (n+2p-f+1)。 若要保证卷积前后图片尺寸不变,则p应满足:
\[p=\frac{f-1}{2}\]- 没有padding操作,p=0,我们称之为Valid convolutions
- 有padding操作,$p=\frac{f-1}{2}$,我们称之为Same convolutions,保证卷积前后尺寸不变。
卷积步长(Strided convolutions)
stride表示filter在原图片中水平方向和垂直方向每次的步进长度。之前我们默认stride=1。
三维卷积(Convolutions over volumes)
检测灰度图像的特征,是一个通道,也想检测RGB彩色图像的特征,对应红、绿、蓝三个通道,即通道数为3。 三维分别表示图片的高度(height)、宽度(weight)和通道(channel),图像的通道数必须和过滤器的通道数匹配。
过程是将每个单通道与对应的filter进行卷积运算,然后再将3通道的和相加,得到输出图片的一个像素值。不同通道的滤波算子可以不相同。
单层卷积网络(One layer of a convolutional network)
选定滤波器组后,参数数目与输入图片尺寸无关。所以,就不存在由于图片尺寸过大,造成参数过多的情况。参数=filter.Hfilter.Wfilter.C*滤波器组数
例如一张1000x1000x3的图片,标准神经网络输入层的维度将达到3百万,而在CNN中,参数数目只由滤波器组决定,数目相对来说要少得多,这是CNN的优势之一。
最后,我们总结一下CNN单层结构的所有标记符号,设层数为l。
- $f^{[l]}$ = filter size
- $p^{[l]}$ = padding
- $s^{[l]}$ = stride
- $n_c^{[l]}$ = number of filters
输入维度为:$n_W^{[l-1]} * n_H^{[l-1]} * n_c^{[l-1]}$
每个滤波器组维度为:$f^{[l]} * f^{[l]} * n_c^{[l-1]}$
权重维度为:$f^{[l]} * f^{[l]} * n_c^{[l-1]} * n_c^{[l]}$
偏置维度为:$1 * 1 * 1 * n_c^{[l]}$
输出维度为:$n_H^{[l]} * n_W^{[l]} * n_c^{[l]}$ 其中,
\[n_H^{[l]}=\lfloor \frac{n_H^{[l-1]}+2p^{[l]}-f^{[l]}}{s^{[l]}}+1 \rfloor\] \[n_W^{[l]}=\lfloor \frac{n_W^{[l-1]}+2p^{[l]}-f^{[l]}}{s^{[l]}}+1 \rfloor\]如果有m个样本,进行向量化运算,相应的输出维度为:$m * n_H^{[l]} * n_W^{[l]} * n_c^{[l]}$
Simple Convolutional Network
输出层可以是一个神经元,即二元分类(logistic);也可以是多个神经元,即多元分类(softmax)。最后得到预测输出ŷ 。
随着CNN层数增加,$n_H^{[l]}和n_W^{[l]}一般逐渐减小,而n_c^{[l]}一般逐渐增大$。
CNN有三种类型的layer:
- Convolution层(CONV)卷积层
- Pooling层(POOL)池化层
- Fully connected层(FC)全连接层
池化层(Pooling layers)
使用池化层来缩减模型的大小,提高计算速度,同时提高所提取特征的鲁棒性
Pooling layers的做法比convolution layers简单许多,没有卷积运算, 仅仅是在滤波器算子滑动区域内取最大值,即max pooling,这是最常用的做法。 如果是多个通道,那么就每个通道单独进行max pooling操作。除了max pooling之外, 还有一种做法:average pooling。max pooling比average pooling更为常用。
Max pooling的好处是只保留区域内的最大值(特征),忽略其它值,降低noise影响,提高模型健壮性。
而且,max pooling需要的超参数仅为滤波器尺寸f和滤波器步进长度s,没有其他参数需要模型训练得到,计算量很小。
1x1 Convolutions
filter的维度为1x1,可以用来缩减channel数目,获得filter个数的channel数,池化层压缩它的高度和宽度
Inception network motivation
代替人工来确定卷积层中的过滤器类型,或者确定是否需要创建卷积层或池化层
Inception Network使用不同尺寸的filters并将CONV和POOL混合起来,将所有功能输出组合拼接,再由神经网络本身去学习参数并选择最好的模块。
提升性能的同时,计算量大。
由(28×28×32)x(5×5×192) => (28x28x16)x192+(28x28x32)x(5x5x16) 计算量减少了近90%
Why CNN
相比标准神经网络,CNN的优势之一就是参数数目要少得多。参数数目少的原因有两个:
- 参数共享:一个特征检测器(例如垂直边缘检测)对图片某块区域有用,同时也可能作用在图片其它区域。
- 连接的稀疏性:因为滤波器算子尺寸限制,每一层的每个输出只与输入部分区域内有关。
除此之外,由于CNN参数数目较小,所需的训练样本就相对较少,从而一定程度上不容易发生过拟合现象。 而且,CNN比较擅长捕捉区域位置偏移。也就是说CNN进行物体检测时,不太受物体所处图片位置的影响,增加检测的准确性和系统的健壮性。
1D and 3D Generalizations