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

computer vision

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

边缘检测

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

padding

使用原因

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

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

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

stride convolution

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

多个channel的卷积

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

卷积层的实现

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

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

Pooling

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

Fully connected (FC)

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

为什么使用卷积

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

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

猜你喜欢

转载自blog.csdn.net/qq_33669204/article/details/83794635