0%

卷积神经网络-基础

卷积神经网络-基础

计算机视觉

计算机视觉问题:图片分类、目标检测、图片风格迁移

在较大图片上的深度学习:

假设图片是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)

image-20201225230911493
image-20201225230911493

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

image-20201225231127552
image-20201225231127552

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

image-20201225232243785
image-20201225232243785

如果用python来实现,则会使用conv_forwoard()函数进行卷积运算,如果是在tensorflow,则是tf.nn.conv2d,如果是keras,则是Conv2D,基本上所有的编程框架,都会有一些函数来实现卷积运算

注:这种操作有时被称为互相关而不是卷积,因为严格意义上的数学中定义的卷积中在做元素乘积求和之前,还需要先将过滤器沿水平和垂直轴翻转,但按机器学习的惯例,通常不需要进行这个翻转操作

为什么这个可以做垂直边缘检测呢?

image-20201225232801410
image-20201225232801410

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

更多的边缘检测

image-20201225233145414
image-20201225233145414

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

同样的,水平边缘检测的过滤器如下图

image-20201225233801912
image-20201225233801912

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

image-20201225233914828
image-20201225233914828

它的优点在于:增加了中间一行元素的权重,这使得结果的鲁棒性会更高一些

再如:

实际上这也是一种垂直边缘检测,如果道将其翻转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) 维矩阵

这样的话会有两个缺点:

  1. 每次卷积操作,都会让图像缩小
  2. 角落边的像素只会被一个输出所使用,而中间的像素点,就会有许多3 × 3的矩阵与之重叠,就会被多个输出所使用;即角落或边缘区的像素点在输出中采样少,相当于会丢掉图像边缘位置;

为了解决这两个缺点:

  1. 缩小输出
  2. 在卷积操作之前,填充图像(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\)通常是奇数的原因:

  1. 如果f是一个偶数,那么就只能使用一些不对称填充,只有f是奇数时,same卷积都会有自然的填充
  2. 当有一个奇数维过滤器时,它就有一个中心点,有时在计算机视觉中,有一个中心像素点会更方便,便于指出过滤器的位置

卷积步长(Strided Convolutions)

卷积步长就是过滤器在输入图像上每次移动的步数,如图是步长为2的情况

image-20201226102853468
image-20201226102853468

新的卷积公式 \[ 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对应三通道),输入图像和过滤器通道数必须相同,如图

image-20201226105848237
image-20201226105848237

对应的计算,和二维类似,也是将3×3×3=27个数相乘再想加得到结果

而如果为了检测红色的边缘,则可以将三个通道中的R通道置为二维边缘检测对应的过滤器,G和B则全置0,同样的,如果将三个通道全置为二维边缘检测对应的过滤器,则可以检测任意颜色通道的边缘

多过滤器情况,如下图:

image-20201226110638537
image-20201226110638537

总结:

\(n×n×n_c\ *\ f×f×n_c \rightarrow n-f+1 × n-f+1 × n_c'(n_c':过滤器数量)\)

单层卷积网络

如图,将输入图像和两个过滤器卷积,最终 各自形成一个卷积神经网络层,然后增加偏差,然后应用非线性函数如ReLU,输出一个4×4矩阵

image-20201226152031740
image-20201226152031740

卷积层符号总结:

如果第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\)

image-20201226155934667
image-20201226155934667

一个典型的卷积网络通常有三类层:

  • 卷积层,常用Conv标注
  • 池化层,常用POOL标注
  • 全连接层,常用FC表示

池化层(Pooling layers)

池化层:最大池化(Max pooling)

如图,对于一个4×4的矩阵,执行最大池化的输出是一个2×2矩阵,将4×4矩阵进行类似卷积的操作,只是将相乘再想加的步骤换成取最大值

image-20201226195203508
image-20201226195203508

相当于2×2的过滤器,步幅为2,即超参数f=2,s=2

最大化运算的实际作用就是:如果在过滤器中提取到某个特征,则保留其最大值,如果没有提取到这个特征,则最大值也还是很小

同理,如果有多个通道,则分别对每个通道单独进行上述操作,得到多通道结果

平均池化(不太常用):

和最大池化类似,但选择的不最大值,而是平均值,如图

image-20201226200142414
image-20201226200142414

池化总结:

超参数:

\(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

同理后续步骤如图:

image-20201226202312020
image-20201226202312020

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

然后再添加一个84个单元的全连接层,称为FC4,最后用这84个单元的输出填充softmax单元,对于手写数字识别而言,softmax就会有10个输出

image-20201226202918400
image-20201226202918400

需要注意的是:

  1. 超参数尽量不要自己随意设置,而是先参考文献中效果较好的数值
  2. 随着神经网络深度的加深,会发现\(n_H\)\(n_W\)通常都会减少,而\(n_c\)会增加
  3. 在神经网络中另一种常见的模式是:一个或多个卷积层后加一个池化层,然后一个或多个卷积层后面再跟一个池化层,然后是几个全连接层,最后是一个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

注意:

  1. 输入层和池化层-最大池化层没有参数
  2. 卷积层的参数相对较少
  3. 随着神经网络加深,激活值会逐渐变小,如果激活值下降太快,也会影响网络性能

为什么使用卷积神经网络?

和只用全连接层相比,卷积层的优势:

  1. 参数共享:一个特征检测(如垂直边缘检测),对于图像的一部分适用,那么它也可能适用于图片的其它区域
  2. 稀疏连接:在每一层,每个输出值只依赖于少量的输入,如输出的左上角的值只依赖于输入左上角部分的单元格

如对于一张32×32×3(=3072)的图,通过f=5的6个过滤器卷积后,结果是28×28×6=4704

而如果构建一个普通神经网络,则如果一层含有3072个单元,下一层有4704个单元,以全连接形式连接,计算权重矩阵,则这个权重矩阵维度为3072×4704约等于1400万,所以需要训练的参数会很多,并且随着图片大小的增大,这个权重矩阵还会更大,

而对于卷积方式的参数数量,则只需要5×5+1(1个偏差参数)=26×6=156个参数

image-20201226210647458
image-20201226210647458