吴恩达深度学习总结(10)

computer vision

针对图像任务不能和之前一样直接使用全连接进行,因为如果图片分辨率很高那么向量化之后需要的参数空间很大,不便于计算,于是引入了卷积计算

边缘检测

边缘检测分为垂直边缘检测(vertical detection)和水平边缘检测(horizontal detection)。
垂直边缘检测使用的过滤器为
[101101101]\left[\begin{matrix} 1&0&-1\\1&0&-1\\1&0&-1\end{matrix}\right]
该过滤器的原理是当左边明亮,右边深色时就会认为是垂直边缘
吴恩达深度学习总结(10)
输出图片中间的明亮处可以认为在原图片中的该位置有明显的边缘。
该边缘检测方法可认为是卷积的一个典型例子
同样,水平算子可以表示为[111000111]\left[\begin{matrix}1&1&1\\0&0&0\\-1&-1&-1\end{matrix}\right]
对于深度学习来说,可以通过神经网络来学习一样这样的算子进行边缘检测。

padding

使用原因

  1. 若不使用,那么每一次卷积之后图像都会变小
  2. 边缘部分的像素在卷积过程中使用的较少,因此图像大部分的边缘信息在卷积过程中都丢失了
    使用padding后,每隔一个像素进行卷积的输出结果为:n+2pf+1n + 2p - f +1
    其中 nn 为输入图片的大小,pp 为padding的大小,ff 为卷积核的大小

根据是否padding,我们将卷积操作分为Valid convolution和Same convolution

  1. valid convolution为不使用padding的卷积,因此输出大小为nf+1n-f+1
  2. same convolution为使用padding的卷积,输出图片的尺寸和输入图片的尺寸大小相同
    在计算机视觉的任务重,我们认为kernel为奇数,这样做一方面是因为kernel为偶数时图片两边会产生不对称填充;另一方面奇数kernel会产生一个像素中心店,这个中心点有时候会有用(如指出滤波器的位置)。

stride convolution

stride是指每隔多少个像素进行一次卷积
若输入为 nnn*n 的图片,卷积核为 fff*f,padding为 pp,stride为 ss,那么在stride convolution后的输出图片大小为
n+2pfs+1\lfloor\frac{n+2p-f}{s}+1\rfloor
这里需要指出两种卷积的不同定义:在数学上我们说的卷积需要将卷积核向左翻转 9090^{\circ},然后左右互换;在深度学习中的卷积是卷积核直接与输入对应位置相乘。这样做一方面简化的代码实现的复杂度,另一方面也可以取得满意的效果

多个channel的卷积

卷积核的channel个数与输入channel个数相同
n×n×ncf×f×nc(nf+1)×(nf+1)×nc n\times n\times n_c * f \times f \times n_c \to (n-f+1 )\times (n-f+1) \times n_c'
ncn_c 为输入channel的个数, ncn_c' 为卷积核的个数

卷积层的实现

卷积层在**之前会加一个bias,然后再**,基于这个实现,我们可以理解卷积实际上是对kernel大小的像素进行之前学习过的深度学习连接,然后再**。

若有一个10层输出,输出中每一个值由前一层经 3333*3*3 的卷积得到,那么参数个数为?
输出的每一层的卷积核参数个数为 333=273*3*3=27,在卷积之后需要加上bias,所以参数个数为 27+1=2827+1=28,10层输出于是总个数为 2810=28028*10 = 280。不管输入图片多大,需要的参数个数为 280(即对输入每一层的所有位置上的像素使用同一个卷积)。这样大大减少了参数的个数‘避免过拟合’。
f[l]=filter sizef^{[l]} = \text{filter size}
p[l]=paddingp^{[l]} = \text{padding}
s[l]=strides^{[l]} = \text{stride}
nc[l]=number  of  filtersn_c^{[l]} = \text{number\;of\;filters}
Input:  nH[l1]×nW[l1]×nc[l1]\text{Input}:\;n_H^{[l-1]}\times n_W^{[l-1]}\times n_c^{[l-1]}
output:  nH[l]×nW[l]×nc[l]\text{output}:\;n_H^{[l]}\times n_W^{[l]}\times n_c^{[l]}
于是当前层每一个卷积核为 f[l]×f[l]×nc[l1]f^{[l]}\times f^{[l]}\times n_c^{[l-1]}
**之后 a[l]nH[l]×nW]l]×nc[l]a^{[l]} \to n_H^{[l]}\times n_W^{]l]}\times n_c^{[l]}A[l]m×nH[l]×nW]l]×nc[l]A^{[l]} \to m\times n_H^{[l]}\times n_W^{]l]}\times n_c^{[l]},也可以将channel的个数放在前面即 m×nc[l]×nH[l]×nW]l]m\times n_c^{[l]}\times n_H^{[l]}\times n_W^{]l]}
权重个数为 f[l]×f[l]×nc[l1]×nc[l]f^{[l]}\times f^{[l]}\times n_c^{[l-1]} \times n_c^{[l]},bias为 1×1×1×nc[l]1\times 1\times 1\times n_c^{[l]}

Pooling

作用:如果过滤器中提取到某个特征,那么保留其最大值;如果没有提取到特征,那么其最大值依旧很小
注意pooling不改变channel的个数
除了Max pooling之外,也有average pooling。对于pooling我们经常设置的超参数为 f=2f= 2s=2s=2。基于这两个超参数,pooling层通常会使长和宽减半,pooling层很少使用padding,而且pooling层没有参数需要学习。

Fully connected (FC)

全连接层是将上一层的输出平整化为一个单一向量,进行与之前学习的神经网络相同的链接进行运算。全连接层可以不止一个。我们可以认为之前的网络每一层都使用全连接。

为什么使用卷积

极大的减少了参数的个数,避免了过拟合。
参数少的原因有两个:

  1. 参数共享:一个特征检测器若在一个区域内有用,那么他对其他区域也会有用
  2. 稀疏连接:每一层输出的值只依赖其对应 kernel上的值,其他像素值均不会对该输出产生影响