吴恩达deeplearning.ai《卷积神经网络》-深度学习的实用层面(一)

计算机视觉

计算机视觉解决的问题:

1.图像分类问题
识别出一张图片是不是猫
2.目标检测
将图片中的车用方框圈出来
3.图像风格迁移
将图像和另一张带有风格的图片,结合成新的图片
吴恩达deeplearning.ai《卷积神经网络》-深度学习的实用层面(一)
如果采用RGB图像,一个像素一般是三通道的。故,一个图片64×64×3=12288个特征
如果是下面猫的图像,总共3 million个特征,放入神经网络训练,就会导致3m个输入的x
假设我们第一层隐藏节点的个数为1000个,那么我们w[1]为(1000,3m)
这也就导致w[1]总共有1000×3m=3billion 个参数。面对如此大的参数,很难找到足够量的数据。来防止神经网络过拟合和竞争需求。如此大的数据量,内存是无法支撑的。故,面对这种情况我们需要卷积操作。
吴恩达deeplearning.ai《卷积神经网络》-深度学习的实用层面(一)

边缘检测示例

首先我们考虑边缘检测的例子。
吴恩达deeplearning.ai《卷积神经网络》-深度学习的实用层面(一)
我们以6×6的灰度图像举例。我们构建一个3×3的矩阵,称为filter或kenel。我们将6×6的图像,卷积上3×3的filter,我们将得到4×4的矩阵。我们将filter覆盖在图像的左上角,对应相乘并相加,最后写在结果矩阵的左上角。
吴恩达deeplearning.ai《卷积神经网络》-深度学习的实用层面(一)
然后把filter,向右移动一步。在进行卷积操作,得到-4。结果写在第一行,第二列的位置。右移到头以后,返回最左边。然后进行下移。
python中,卷积运算函数:conv-forward
tensorflow中,卷积运算函数:tf.nn.conv2d
keras中,卷积运算函数:conv2d
吴恩达deeplearning.ai《卷积神经网络》-深度学习的实用层面(一)
在filter
吴恩达deeplearning.ai《卷积神经网络》-深度学习的实用层面(一)
可以检测竖直的边缘

举例来说:

如果我们采用如下图,左边都是10,右边是0的图像(也就是左边是白色,右边是灰色,中间有一个竖直的交界线)卷积上我们竖直检测的filter(也就是左边白色,中间灰色,右边黑色)。我们最后得到的图像,只有在交界线的位置,为30,也就是白色。其他区域都为灰色。
吴恩达deeplearning.ai《卷积神经网络》-深度学习的实用层面(一)

如果我们将图像左右交换(左边为灰色,右边为白色),再使用卷积运算,那么就会出现交界线位置为黑色,其余位置为灰色。
吴恩达deeplearning.ai《卷积神经网络》-深度学习的实用层面(一)
我们可以看到在上面都是10,只有下面一条是0的位置。(也就是上面亮,下面暗)我们卷积出来的结果是30。我们可以看到在上面都是0,只有下面一条是10的位置。(也就是上面暗,下面亮)我们卷积出来的结果是-30。对于两个明暗块,产生的十字交界线的位置。我们卷积出来的结果是10和-10。如果我们的图像足够大,那么可能不会出现10,-10的结果
吴恩达deeplearning.ai《卷积神经网络》-深度学习的实用层面(一)

我们可以改进边缘检测的filter矩阵

如,sobel filter:其优点为增加了算法的鲁棒性(鲁棒Robust,也就是健壮和强壮的意思。它也是在异常和危险情况下系统生存的能力。比如说,计算机软件在输入错误、磁盘故障、网络过载或有意攻击情况下,能否不死机、不崩溃,就是该软件的鲁棒性)
scharr filter,也是另一种filter
或者你可以根据你的图像的属性,手写一个filter矩阵。目前,我们可以根据神经网络反向传播时,自动选择出filter矩阵之中的参数,来代替之前的手写矩阵。这样能实现,更多的检测。如45°,70°的线条。
吴恩达deeplearning.ai《卷积神经网络》-深度学习的实用层面(一)

padding

最后输出图像的维度计算公式为:
n-f+1
其中,n为输入图像的维度,f为卷积filter的维度。

例如:

6×6的图像,卷积上3×3的卷积filter,最后的输出的图像为6-3+1=4,也就是4×4维度的输出图像。

我们可以看到经过卷积以后

1.输出的图像的维度相较于输入图像,维度会减少。导致输出图像尺寸越来越小。
2.图像最外层边缘经常只能被卷积覆盖,并计算一次。而图像的中间区域,反而会被卷积计算多次。这样会导致输出的图像,丢失部分的图像最外层边缘的信息。
吴恩达deeplearning.ai《卷积神经网络》-深度学习的实用层面(一)

为了解决以上两个问题,我们提出了padding方法。

也就是将图像最外层填充一圈像素。(即图像扩大了一圈)通常可以用0来填充新增的最外层。
p=padding的值=1,也就是图像外圈被填充了一像素的一层。
此时,输出的图像计算公式为:
n+2p-f+1

例如:

6×6的图像padding了一像素,也就变成了8×8的图像。其输出图像的维度:
6+2×1-3+1=6×6
也就是经过padding,我们输入的图像和输出的图像的维度达到了相同。并且其丢失的最外层边缘的信息也得到了解决。
吴恩达deeplearning.ai《卷积神经网络》-深度学习的实用层面(一)

对于padding我们通常有两个选择:

1.valid convolution:

没有padding,输出结果维度的公式即为:n-f+1

2.same convolution:

让输入图像的维度等于输出图像的维度,输出结果维度的公式即为:n+2p-f+1
如果我们想要输入维度等于输出维度,也就是n+2p-f+1=n
解方程得:p=f-1/2


故,这也就解释了。我们设计filter的时候,其维度一般都是奇数的。如果为偶数,p=f-1/2将不是整数。也就是在padding时,我们无法做到对称的周围一圈全部填充像素值。所以,我们设计filter时,其维度尽量是1×1,3×3,5×5等奇数值。
吴恩达deeplearning.ai《卷积神经网络》-深度学习的实用层面(一)

卷积步长

如果我们将stride参数,也就是步长参数设为2。那么也就是每次向右或向下移动两个像素单位。
吴恩达deeplearning.ai《卷积神经网络》-深度学习的实用层面(一)
对于最后输出的图像的维度,公式为:
取下整 [n+2p-f / s +1]

例如:

我们的输入图像维度为7×7,filter维度为3×3,stride步长为2,输出图像维度为7+0-3 / 2 +1 =3×3的图像。

注:其中我们只考虑,filter能完全覆盖图像的情况。如果filter超出了图像的边界,我们就不进行计算。
吴恩达deeplearning.ai《卷积神经网络》-深度学习的实用层面(一)
吴恩达deeplearning.ai《卷积神经网络》-深度学习的实用层面(一)

补充:

数学中的卷积运算,我们一般需要将filter进行横向和纵向的镜像反转。之后,进行对应相乘,然后相加。而,计算机中卷积运行,我们无需进行filter的翻转。直接进行对应相乘再相加。(在数学中,称为cross-correlation互相关)我们在计算机中,称此种方法通常叫做convolution,卷积运算。
吴恩达deeplearning.ai《卷积神经网络》-深度学习的实用层面(一)

卷积为何有效

我们知道在正常情况下,图像是存在很多通道的。如RGB图像,存在红绿蓝三通道。故现实中,我们的卷积图像为6×6×3的矩阵。第一个6,代表图像的高度。第二个6,代表图像的宽度。第三个3,代表图像的通道数。经过卷积,(卷积filter也为3通道的)。我们只是得到4×4的单通道输出结果。
吴恩达deeplearning.ai《卷积神经网络》-深度学习的实用层面(一)
对于三通道的图像与三通道的filter,我们仍然采用每个通道分别对应相乘。然后三个通道相加。最后产生卷积结果。即3×3×3为27个数,对应相乘然后相加,最后变成一个数。
吴恩达deeplearning.ai《卷积神经网络》-深度学习的实用层面(一)
我们可以完成对于单一一个通道进行的边缘检测。或者对于每个通道都进行边缘检测。如,我们将filter中的R通道赋予竖直边缘检测的矩阵。其他通道矩阵设为0。即只对于R通道进行竖直边缘检测。
吴恩达deeplearning.ai《卷积神经网络》-深度学习的实用层面(一)
如果我们采用不同的filter,同时进行卷积运算。如第一个filter来检测图像的竖直边缘。第二个filter检测图像的水平边缘。那么我们将得到两个卷积后的结果。将两个结果,叠加起来。形成了4×4×2的立方体。故,我们最后结果输出的通道数 = 我们进行检测的特征数 = 我们使用了多少个不同的filter
吴恩达deeplearning.ai《卷积神经网络》-深度学习的实用层面(一)

单层卷积网络

类似于神经网络的z[1]=w[1] a[0] + b[1],a[1] = g(z[1]),其中输入图像类比于我们的a[1],filter类比于我们的w[1],经过卷积相当于w[1] a[0],最后加上b1。使用**函数,如Relu函数,类比于g(z[1])。得到多个结果,我们叠加在一起,形成a[2]
吴恩达deeplearning.ai《卷积神经网络》-深度学习的实用层面(一)

例题:

我们有10个3×3×3的filter,在一层的神经网络中,问,总共我们共有多少个参数。

解答:

一个flter的参数为3×3×3+1(1为bias项)=28个参数。故10个filter,共有10×28=280个参数。
这也是神经网络防止过拟合的方法。无论我们的图像有多大,我们的filter参数都为固定的,只有280个。且输出的图像,深度仅为10。
吴恩达deeplearning.ai《卷积神经网络》-深度学习的实用层面(一)

总结公式如下:

其中,当我们使用batch梯度下降时,我们可能会分成m个batch。故,A[L]为m×nH[l] ×nw[l] × nc[l]
参数w,weights为filter中的总共的参数。由于有多个filter,故最后乘上了nc[l]
吴恩达deeplearning.ai《卷积神经网络》-深度学习的实用层面(一)

简单卷积网络示例

刚开始我们图像的特征数为39×39×3非常庞大,我们设计多步骤的卷积,最后将图像变成了7×7×40的矩阵。之后,我们将这个矩阵共1960个数字,展开成一个向量,这个向量只有1960个特征。即可使用逻辑回归或者softmax回归进行图像的分类。
我们可以看到的趋势,进过卷积,图像的宽度和高度都在减小。图像的通道数在增多。
吴恩达deeplearning.ai《卷积神经网络》-深度学习的实用层面(一)

卷积神经网络的每层共有3个种类:

1.卷积层
2.池化层
3.全连接层
我们可以只使用卷积层即可到达设计卷积神经网络的效果。也可使用三种类型来进行混合设计。
吴恩达deeplearning.ai《卷积神经网络》-深度学习的实用层面(一)

池化层

我们也会经常使用池化层,来减小模型大小,提高计算速度,同时提高提取特征的鲁棒性。

max pooling
做法:

filter的大小f为2,stride为2。那么也就是在filter覆盖的区域,找出最大的数字。然后写在输出结果的对应位置。


理解,max pooling将图像某个特定的filter覆盖的区域中的矩阵数字,看成不同的特征。使用找出最大数的max操作,实际上是加强了某个特征。如,9可能表示图像中的人的眼睛,经过max pooling,人的眼睛的特征被放大了。

注:

不同于卷积操作,我们经常使用反向传播来确定filter中每个参数的数值。max pooling中,我们无需确定。因为pooling中的f与s参数,在一开始就是确定的。无需通过后面的反向传播来确定。
吴恩达deeplearning.ai《卷积神经网络》-深度学习的实用层面(一)
如果输入图像为2通道,那么经过max pooling,输出的图像也为2通道
吴恩达deeplearning.ai《卷积神经网络》-深度学习的实用层面(一)

average pooling

就是在filter覆盖区域,取平均值。相对于,max pooling,average pooling使用的较少。但是,对于深度很深的卷积神经网络。我们会采用average pooling,来将7×7×1000的图像变成1×1×1000的图像。
吴恩达deeplearning.ai《卷积神经网络》-深度学习的实用层面(一)

总结:

对于max pooling,我们常用f=2,s=2的参数。也就是结果图像相对于输入图像,大小缩小为原来的一半。此外,pooling中我们很少使用padding。输入图像的通道数 = 输出图像的通道数,故最后输出图像维度乘上nc。此外,反向传播中没有参数需要学习。
吴恩达deeplearning.ai《卷积神经网络》-深度学习的实用层面(一)

卷积神经网络示例

假设我们有一个图像手写字体的7,我们需要来识别此字体。本案例类似于LeNet-5网络。对于全连接层,我们相当于普通神经网络。即,将图像展开成为向量以后,使用全连接的神经网络。将向量缩小为更小的向量。
在计算cnn的层数,我们通常将卷积层+池化层合起来,成为一层。因为卷积层不光需要设定参数(需要反向传播来确定参数的值),还有超参数。而池化层,只有一些超参数。故,下图cnn共有两层。
吴恩达deeplearning.ai《卷积神经网络》-深度学习的实用层面(一)
池化层没有参数,卷积层参数较少。可见,参数主要集中在全连接层。
如果**值(activation size)下降太快,会影响卷积神经网络的性能。故,我们设计网络的时候,要遵循不要下降太快。
吴恩达deeplearning.ai《卷积神经网络》-深度学习的实用层面(一)

为什么使用卷积

使用卷积相对于使用全连接的方法,其优势主要在于:参数共享(parameter sharing)和稀疏连接(sparsity of connections)

例如:

如果我们的输入图像为32×32×3,输出图像为28×28×6。使用全连接的方法,也就是输入的特征数为3072个,输出的特征数为4704个,那么就需要使用3072×4704 = 14450688个参数。这样会导致计算时占用大量资源。
而如果使用卷积层的话,一个filter只需要5×5+1=26个,共6个filter,总共6×26=156个参数。可以看到参数的个数大大减少,那么节约了大量的计算资源。
吴恩达deeplearning.ai《卷积神经网络》-深度学习的实用层面(一)

参数共享(parameter sharing):

filter中同样一套的参数,可以覆盖于输入图像的任何位置,都能起到同样的效果。如,下图filter的功能是检测竖直线条,那么filter覆盖的任何位置,都能被检测出来竖直的线条

稀疏连接(sparsity of connections):

在卷积中,输出矩阵的值,仅对应于输入图像某个区域的特性。如,当filter覆盖于输入图像左上角时,此时输出矩阵的左上角的数值,对应输入图像的左上角覆盖位置。
吴恩达deeplearning.ai《卷积神经网络》-深度学习的实用层面(一)
我们可以使用梯度下降,或其他优化函数,来优化损失函数J。最后达到训练
吴恩达deeplearning.ai《卷积神经网络》-深度学习的实用层面(一)