卷积神经网络-基础
计算机视觉
计算机视觉问题:图片分类、目标检测、图片风格迁移
在较大图片上的深度学习:
假设图片是64 × 64的,则RGB三通道后,结果就是64×64×3=12288,如果图片更大如1000×1000,则1000 × 1000 × 3 = 300万
而如果要输入300万的数据量,则意味着特征向量x的维度高达300万,所以在第一个隐藏层中,或许有1000个隐藏单元,而所有的权值组成的矩阵\(W^{[1]}\),如果使用了标准的全连接网络,则这个矩阵的大小就是(1000,300万),而这意味着矩阵\(W^{[1]}\)会有30亿个参数,在参数如此大量的情况下,难以获取足够的数据来防止神经网络发生过拟合,同时巨大的内存需求也会让人无法接受。
但是对于计算机视觉应用来说,我们一定不想它只能处理小图片,因此,需要进行卷积运算。
边缘检测案例(卷积运算如何进行的)
对于一张图片的边缘检测,我们可能会想到对它进行垂直边缘检测和水平边缘检测,但如何在图像中检测这些边缘呢?
Eg:如图是一个6 × 6的灰度图像(也就是说它是6 × 6 × 1,而不是6 × 6 × 3)

为了检测图像中的垂直边缘,可以构造一个3 × 3的矩阵,这样一个矩阵通常在卷积神经网络的术语中称为过滤器(在论文中有时会称为核),这个矩阵如下图

然后对这个6 × 6的图像进行卷积运算(用"*")表示,卷积得到一个4 × 4的矩阵,如图,计算步骤,以左上角第一个数为例,将3 × 3矩阵与6 × 6矩阵的左上角取3 × 3的矩阵对位相乘再想加,得到的结果即4 × 4矩阵左上方第一个数的值

如果用python来实现,则会使用conv_forwoard()函数进行卷积运算,如果是在tensorflow,则是tf.nn.conv2d,如果是keras,则是Conv2D,基本上所有的编程框架,都会有一些函数来实现卷积运算
注:这种操作有时被称为互相关而不是卷积,因为严格意义上的数学中定义的卷积中在做元素乘积求和之前,还需要先将过滤器沿水平和垂直轴翻转,但按机器学习的惯例,通常不需要进行这个翻转操作
为什么这个可以做垂直边缘检测呢?

中间3 × 3的矩阵意味着左边亮的部分中间不需要考虑,右边是暗的部分
更多的边缘检测

还是上述的例子,将6 × 6矩阵稍作变动,就会发现结果的30都变成了-30,表明这是由暗向亮过渡,而不是由亮向暗过渡,因此,这个过滤器确实可以区分两种明暗变化的区别
同样的,水平边缘检测的过滤器如下图

还有一些其它的过滤器图,如

它的优点在于:增加了中间一行元素的权重,这使得结果的鲁棒性会更高一些
再如:
实际上这也是一种垂直边缘检测,如果道将其翻转90度,就能得到对应的水平边缘检测
随着深度学习的发展,当想要真正检测出复杂图像的边缘时,不一定要使用固定的某九个数字,可以将矩阵中的9个数字当成9个参数\(w_1 \sim w_9\),然后使用反向传播,相比之前那些简单的过滤器,它可以检测出45°或70°甚至任意角度的边缘
填充(Padding)
为了构建深度神经网络,需要学会使用的一个基本的卷积操作就是padding
之前的内容中可能看到,用一个3 × 3的过滤器卷积一个6 × 6的图像,会得到一个4 × 4的矩阵输出,那是因为用一个3 × 3的过滤器在一个6 × 6的矩阵中只可能有4 × 4种可能位置
背后的数学解释是:如果有一个n × n图像,用一个f × f的过滤器做卷积,则会输出一个(n-f+1) × (n-f+1) 维矩阵
这样的话会有两个缺点:
- 每次卷积操作,都会让图像缩小
- 角落边的像素只会被一个输出所使用,而中间的像素点,就会有许多3 × 3的矩阵与之重叠,就会被多个输出所使用;即角落或边缘区的像素点在输出中采样少,相当于会丢掉图像边缘位置;
为了解决这两个缺点:
- 缩小输出
- 在卷积操作之前,填充图像(pad),填充后,输入图像变成了8 × 8图像,输出变成了6 × 6矩阵,设p是填充的数量,则此案例中p=1(因为在周围都填充了一个像素点),输出也就变成了(n+2p-f+1) × (n+2p-f+1)
Valid卷积和Same卷积:
Valid卷积:不填充,n × n * f × f -> n-f+1 × n-f+1
Same卷积:填充后输出大小和输入大小一样,则\(n+2p-f+1=n \Rightarrow p=\frac{f-1}{2}\),
\(f\)通常是奇数的原因:
- 如果f是一个偶数,那么就只能使用一些不对称填充,只有f是奇数时,same卷积都会有自然的填充
- 当有一个奇数维过滤器时,它就有一个中心点,有时在计算机视觉中,有一个中心像素点会更方便,便于指出过滤器的位置
卷积步长(Strided Convolutions)
卷积步长就是过滤器在输入图像上每次移动的步数,如图是步长为2的情况

新的卷积公式 \[ n×n \ *\ f×f \rightarrow \lfloor\frac{n+2p-f}{s}+1\rfloor × \lfloor\frac{n+2p-f}{s}+1\rfloor\\ padding:p;stride:s ;如果商不是一个整数,则向下取整(\lfloor \rfloor:向下取整符号) \]
三维卷积
假设需要卷积一个RGB图像,则6×6的图像对应的就是6×6×3,为了检测边缘,对应的需要和一个3×3×3的过滤器卷积,三个数通常对应的高、宽、通道数(RGB对应三通道),输入图像和过滤器通道数必须相同,如图

对应的计算,和二维类似,也是将3×3×3=27个数相乘再想加得到结果
而如果为了检测红色的边缘,则可以将三个通道中的R通道置为二维边缘检测对应的过滤器,G和B则全置0,同样的,如果将三个通道全置为二维边缘检测对应的过滤器,则可以检测任意颜色通道的边缘
多过滤器情况,如下图:

总结:
\(n×n×n_c\ *\ f×f×n_c \rightarrow n-f+1 × n-f+1 × n_c'(n_c':过滤器数量)\)
单层卷积网络
如图,将输入图像和两个过滤器卷积,最终 各自形成一个卷积神经网络层,然后增加偏差,然后应用非线性函数如ReLU,输出一个4×4矩阵

卷积层符号总结:
如果第l层是卷积层,则:
\(f^{[l]}\):表示过滤器大小
\(p^{[l]}\):填充数量
\(s^{[l]}\):步幅
\(n_c^{[l]}\):过滤器的数量
输入:\(n_H^{[l-1]}×n_W×n_c^{[l-1]}\)
输出:\(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\)
每个过滤器shape:\(f^{[l]}×f^{[l]}×n_c^{[l-1]}\)
激活函数:\(a^{[l]} \rightarrow n_H^{[l]}×n_W^{[l]}×n_c^{[l]}\)
在mini-batch向量化后:\(A^{[l]} \rightarrow m×n_H^{[l]}×n_W^{[l]}×n_c^{[l]}\)
权重:\(f^{[l]}×f^{[l]}×n_c^{[l-1]}×n_c^{[l]}\)
偏差:\(n_c^{[l]} - (1,1,1,n_c^{[l]})\)
简单卷积网络示例
假设有一张图片,想做图片分类或图片识别,将这张图片定义为x,然后判断图片中是否有猫。
针对这个例子,以一张较小的图片为例,如39×39×3,如下图
\(n_H^{[0]}=n_W^{[0]}=39,n_c^{[0]}=3\)
假设第一层用一个3×3过滤器提取特征,即\(f^{[1]}=3,s^{[1]}=1,p^{[1]}=0\),如果有10个过滤器,则神经网络下一层为37×37×10
\(n_H^{[1]}=n_W^{[1]}=37,n_c^{[1]}=10\)
假设再用一个5×5过滤器,即\(f^{[2]}=5,s^{[2]}=2,p^{[2]}=0\),如果有20个过滤器,则神经网络下一层为17×17×20
\(n_H^{[2]}=n_W^{[2]}=17,n_c^{[2]}=20\)
假设再用一个5×5过滤器,即\(f^{[2]},s^{[2]}=2,p^{[2]}=0\),如果有40个过滤器,则神经网络下一层为7×7×40,计算出来就是1960个特征,然后对该卷积层进行处理,可以将其展开成1960个单元,输出一个向量,然后Logistic Regression 或 Softmax Regression,输出预测值\(\hat y\)

一个典型的卷积网络通常有三类层:
- 卷积层,常用Conv标注
- 池化层,常用POOL标注
- 全连接层,常用FC表示
池化层(Pooling layers)
池化层:最大池化(Max pooling)
如图,对于一个4×4的矩阵,执行最大池化的输出是一个2×2矩阵,将4×4矩阵进行类似卷积的操作,只是将相乘再想加的步骤换成取最大值

相当于2×2的过滤器,步幅为2,即超参数f=2,s=2
最大化运算的实际作用就是:如果在过滤器中提取到某个特征,则保留其最大值,如果没有提取到这个特征,则最大值也还是很小
同理,如果有多个通道,则分别对每个通道单独进行上述操作,得到多通道结果
平均池化(不太常用):
和最大池化类似,但选择的不最大值,而是平均值,如图

池化总结:
超参数:
\(f\):过滤器大小
\(s\):步幅大小
少数情况下,会有:
p:填充
输入维度:\(n_H×n_W×n_c\)
输出维度:\(\lfloor \frac{n_H-f}{s}+1 \rfloor × \lfloor\frac{n_W-f}{s}+1\rfloor×n_c\)
池化过程中没有需要学习的参数,所以反向传播没有参数适用于最大池化
卷积神经网络示例
假设,有一张32×32×3的输入图片,需要进行手写数字识别
假设第一层使用过滤器5×5,步幅为1,无填充,过滤器个数是6,则输出维度为28×28×6(后面增加偏差、应用非线性函数等文字省略),将输出的这层记为Conv1
然后构建一个池化层,选用最大池化,参数f=2,s=2(padding=0省略),则输出维度14×14×6,将该输出标记为POOL1
卷积通常有两种分类,这与层的划分存在一致性
一类卷积是:一个卷积层和一个池化层一起作为一层;
另一类卷积是:将卷积层作为一层,而池化层单独作为一层
人们在计算神经网络层数时,通常只统计具有权重和参数的层,由于池化层没有权重和参数,只有一些超级参数,因此,这里将Conv1和POOL1作为一个卷积,并标记为Layer1
同理后续步骤如图:

最终展开后得到400个单元的输出,然后用这400个单元构建下一层,下一层含有120个单元,也是第一个全连接层,标记为FC3,因为这120个单元和之前400个单元紧密连接(即400个单元与120个单元中的每一个相连接),很像之前的单神经网络,是标准的神经网络,所以称为全连接层。对应的有一个120×400的权重矩阵\(W^{[3]}\)和一个偏差参数
然后再添加一个84个单元的全连接层,称为FC4,最后用这84个单元的输出填充softmax单元,对于手写数字识别而言,softmax就会有10个输出

需要注意的是:
- 超参数尽量不要自己随意设置,而是先参考文献中效果较好的数值
- 随着神经网络深度的加深,会发现\(n_H\)和\(n_W\)通常都会减少,而\(n_c\)会增加
- 在神经网络中另一种常见的模式是:一个或多个卷积层后加一个池化层,然后一个或多个卷积层后面再跟一个池化层,然后是几个全连接层,最后是一个softmax
网络中不同层的激活值形状和大小
激活值形状(shape) | 激活值大小(size) | 参数 | |
---|---|---|---|
输入层 | (32,32,3) | 3,072 | 0 |
CONV1(f=5,s=1) | (28,28,8) | 6,272 | 208 |
POOL1 | (14,14,8) | 1,568 | 0 |
CONV2(f=5,s=1) | (10,10,6) | 1,600 | 416 |
FC3 | (120,1) | 120 | 48,001 |
FC4 | (84,1) | 84 | 10,081 |
Softmax | (10,1) | 10 | 841 |
注意:
- 输入层和池化层-最大池化层没有参数
- 卷积层的参数相对较少
- 随着神经网络加深,激活值会逐渐变小,如果激活值下降太快,也会影响网络性能
为什么使用卷积神经网络?
和只用全连接层相比,卷积层的优势:
- 参数共享:一个特征检测(如垂直边缘检测),对于图像的一部分适用,那么它也可能适用于图片的其它区域
- 稀疏连接:在每一层,每个输出值只依赖于少量的输入,如输出的左上角的值只依赖于输入左上角部分的单元格
如对于一张32×32×3(=3072)的图,通过f=5的6个过滤器卷积后,结果是28×28×6=4704
而如果构建一个普通神经网络,则如果一层含有3072个单元,下一层有4704个单元,以全连接形式连接,计算权重矩阵,则这个权重矩阵维度为3072×4704约等于1400万,所以需要训练的参数会很多,并且随着图片大小的增大,这个权重矩阵还会更大,
而对于卷积方式的参数数量,则只需要5×5+1(1个偏差参数)=26×6=156个参数
