第一周:卷积神经网络

第一周:卷积神经网络

  • 1.0 重点
  • 1.1 计算机视觉
  • 1.2 边缘检测示例
  • 1.3 更多边缘检测内容
  • 1.4 Padding
    • Convolution的分类
  • 1.5 卷积步长
    • Convolution in math textbook:
    • 1.6 三维卷积
  • 1.7 单层卷积网络
    • 记号
  • 1.8 ⚠️ 简单卷积网络示例
  • 1.9 池化层
    • Max Pooling
    • Average Pooling
    • Pooling总结
  • 1.10 卷积神经网络示例
  • 1.11 为什么使用卷积?

本文是卷积神经网络的笔记。

1.0 重点

  1. 一般来说 n C n_C nC随着网络深度增加而增加, n H , n W n_H,n_W nH,nW随着网络深度增加而减小。
  2. 一般卷积到最后都会把 ( n H , n W , n C ) (n_H,n_W,n_C) (nH,nW,nC)的向量拉成 ( n H ∗ n W ∗ n C , 1 ) (n_H*n_W*n_C,1) (nHnWnC,1)的向量,然后使用SoftMax(多选一任务,如判断为0-9中哪个数字),或者使用Logistic(是否问题,如判断是否为猫)
  3. 参数共享
    • 它允许在整个输入值的多个位置使用特征检测器。
    • 它允许梯度下降将许多参数设置为零,从而使得连接稀疏。(即在全联接神经网络中很多参数都会被设置为0)
  4. 稀疏连接
    • 下一层中的每个激活只依赖于前一层的少量激活(数据)。

1.1 计算机视觉

不同于之前的全链接神经网络,卷积神经网络可以减少参数数量。

1.2 边缘检测示例

  • filter / kernel: 类似于卷积核
  • 实现:
    • python:-forward
    • tensorflow:tf.nn.conv2d
    • Keras:Conv2D
  • 例子:
    • 垂直边缘检测Kernel: [ 1 0 − 1 1 0 − 1 1 0 − 1 ] \begin{bmatrix} 1&0&-1 \\ 1&0&-1 \\ 1&0&-1 \end{bmatrix} 111000111
    • 如果输入图片为:(对应一个垂直边界,数值越大越亮)
      [ 10 10 10 0 0 0 10 10 10 0 0 0 10 10 10 0 0 0 10 10 10 0 0 0 10 10 10 0 0 0 10 10 10 0 0 0 ] \begin{bmatrix} 10 & 10 & 10 & 0 & 0 & 0\\ 10 & 10 & 10 & 0 & 0 & 0\\ 10 & 10 & 10 & 0 & 0 & 0\\ 10 & 10 & 10 & 0 & 0 & 0\\ 10 & 10 & 10 & 0 & 0 & 0\\ 10 & 10 & 10 & 0 & 0 & 0 \end{bmatrix} 101010101010101010101010101010101010000000000000000000
    • 则输出为:
      [ 0 30 30 0 0 30 30 0 0 30 30 0 0 30 30 0 ] \begin{bmatrix} 0 & 30 & 30 & 0 \\ 0 & 30 & 30 & 0 \\ 0 & 30 & 30 & 0 \\ 0 & 30 & 30 & 0 \end{bmatrix} 000030303030303030300000

1.3 更多边缘检测内容

  • 水平边缘检测Kernel: [ 1 1 1 0 0 0 − 1 − 1 − 1 ] \begin{bmatrix} 1&1&1 \\ 0&0&0 \\ -1&-1&-1 \end{bmatrix} 101101101
    符合这个模式的被称为正向边缘。
  • 其他竖直边缘检测的Filter:
    • Sobel Filter
      [ 1 0 − 1 2 0 − 2 1 0 − 1 ] \begin{bmatrix} 1&0&-1 \\ 2&0&-2 \\ 1&0&-1 \end{bmatrix} 121000121
    • Scharr Filter
      [ 3 0 − 3 10 0 − 10 3 0 − 3 ] \begin{bmatrix} 3&0&-3 \\ 10&0&-10 \\ 3&0&-3 \end{bmatrix} 31030003103

1.4 Padding

  • 卷积操作后的尺寸:
    • 原图像: n × n n\times n n×n
    • Kernel: f × f f\times f f×f
    • 输出: ( n − f + 1 ) ∗ ( n − f + 1 ) (n-f+1)*(n-f+1) (nf+1)(nf+1)

为了解决边缘数据丢失和尺寸变小的问题,我们采用Padding:

  • Padding: p
  • 输出: ( n + 2 × p − f + 1 ) ∗ ( n + 2 × p − f + 1 ) (n+2\times p-f+1)*(n+2\times p-f+1) (n+2×pf+1)(n+2×pf+1)

Convolution的分类

  • "Valid" Convolution: 无Padding,输出为 ( n − f + 1 ) ∗ ( n − f + 1 ) (n-f+1)*(n-f+1) (nf+1)(nf+1)
  • "Same" Convolution: 有Padding,输出的尺寸和输入的尺寸一致。 ( n + 2 p − f + 1 ) ∗ ( n + 2 p − f + 1 ) (n+2p-f+1)*(n+2p-f+1) (n+2pf+1)(n+2pf+1)
    • 所以此时Padding p = f − 1 2 p = \frac{f-1}{2} p=2f1,所以Kernel基本上的尺寸 f f f为奇数。

1.5 卷积步长

  • Stride:s
  • 输出为 [ n + 2 ∗ p − f s + 1 ] [\frac{n+2*p-f}{s}+1] [sn+2pf+1]向下取整数。

Convolution in math textbook:

实际上我们用的是cross-correlation,尽管信息中我们出于习惯将其称为卷积。

在数学书中,Convolution需要取Kernel的镜像,如:
[ 3 4 5 1 0 2 − 1 9 7 ] \begin{bmatrix} 3&4&5 \\ 1&0&2 \\ -1&9&7 \end{bmatrix} 311409527
数学上之所以引入这个定义是可以了让卷积操作具有结合律。但实际上信息上我们不需要。

1.6 三维卷积

  • 输入: n × n × n c n \times n \times n_c n×n×nc, n c n_c nc表示通道数/深度
  • n c ′ 个 n_c'个 nc卷积核: f × f × n c f \times f \times n_c f×f×nc
  • 输出: ( n − f + 1 ) × ( n − f + 1 ) × n c ′ (n-f+1) \times (n-f+1) \times n_c' (nf+1)×(nf+1)×nc

1.7 单层卷积网络

  • 对卷积核 i i i的输出之后加一个常数 b i b_i bi,之后再通过激活函数得到一个输出,将 n c ′ n_c' nc个输出叠加起来得到最后的结果。
    【类比全联接神经网络】
  • 练习:
    • 10个 3 ∗ 3 ∗ 3 3*3*3 333的卷积核有多少个参数?
    • 10 ∗ ( 3 ∗ 3 ∗ 3 + 1 ) = 280 10*(3*3*3+1)=280 10(333+1)=280 个参数。

记号

  • f [ l ] f^{[l]} f[l]:第l层的Filter大小

  • p [ l ] p^{[l]} p[l]:第l层的Paddingr大小

    • 如果是Same Padding p [ l ] = f [ l ] − 1 2 p^{[l]}=\frac{f^{[l]}-1}{2} p[l]=2f[l]1
  • s [ l ] s^{[l]} s[l]:第l层的Stride大小

  • l l l输入 n H [ l − 1 ] × n W [ l − 1 ] × n C [ l − 1 ] n_H^{[l-1]} \times n_W^{[l-1]} \times n_C^{[l-1]} nH[l1]×nW[l1]×nC[l1]

  • l l l输出 n H [ l ] × n W [ l ] × n C [ l ] n_H^{[l]} \times n_W^{[l]} \times n_C^{[l]} nH[l]×nW[l]×nC[l]

    • 具体参数尺寸计算:

    n H [ l ] = ⌊ n H [ l − 1 ] + 2 × p [ l ] − f [ l ] s [ l ] + 1 ⌋ n_H^{[l]}=\left \lfloor \frac{n_H^{[l-1]}+2\times p^{[l]}-f^{[l]}}{s^{[l]}}+1 \right \rfloor nH[l]=s[l]nH[l1]+2×p[l]f[l]+1

    n W [ l ] = ⌊ n W [ l − 1 ] + 2 × p [ l ] − f [ l ] s [ l ] + 1 ⌋ n_W^{[l]}=\left \lfloor \frac{n_W^{[l-1]}+2\times p^{[l]}-f^{[l]}}{s^{[l]}}+1 \right \rfloor nW[l]=s[l]nW[l1]+2×p[l]f[l]+1

  • 第l层的filters个数: n C [ l ] n_C^{[l]} nC[l]

    • 每个Filters的大小为 f [ l ] × f [ l ] × n C [ l − 1 ] f^{[l]}\times f^{[l]}\times n_C^{[l-1]} f[l]×f[l]×nC[l1]
  • 单个样本的激活输出: a [ l ] a^{[l]} a[l],尺寸为 n H [ l ] × n W [ l ] × n C [ l ] n_H^{[l]} \times n_W^{[l]} \times n_C^{[l]} nH[l]×nW[l]×nC[l]

  • 将m个样本的输出 A [ l ] A^{[l]} A[l],尺寸为 m × n H [ l ] × n W [ l ] × n C [ l ] m\times n_H^{[l]} \times n_W^{[l]} \times n_C^{[l]} m×nH[l]×nW[l]×nC[l]

  • l l 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]} f[l]×f[l]×nc[l1]×nc[l]

  • l l l层Bias的尺寸: ( 1 , 1 , 1 , n c [ l ] ) (1,1,1,n_c^{[l]}) (1,1,1,nc[l])

1.8 ⚠️ 简单卷积网络示例

一般来说 n C n_C nC随着网络深度增加而增加, n H , n W n_H,n_W nH,nW随着网络深度增加而减小。

这个例子过于简单,我们直接看1.10中的LeNet-5即可。

1.9 池化层

Max Pooling

  • 一个f=2(尺寸 2 ∗ 2 2*2 22),步长为2的例子。
    第一周:卷积神经网络_第1张图片
  • 基本原理
    如果通过卷积提取到这个特征,则保留这个数据。
  • 它没有什么需要学习的
  • ⚠️ 尺寸计算:
    类似于之前的卷积的计算,如果
    • 输入尺寸为 n ∗ n ∗ n c n*n*n_c nnnc
    • Kernel f ∗ f ∗ n c f*f*n_c ffnc
    • Padding p p p(很少用!)
    • Stride s s s
    • 输出尺寸为 ⌊ n + 2 ∗ p − f s + 1 ⌋ × ⌊ n + 2 ∗ p − f s + 1 ⌋ ∗ n c \left \lfloor \frac{n+2*p-f}{s}+1 \right \rfloor \times \left \lfloor \frac{n+2*p-f}{s}+1 \right \rfloor*n_c sn+2pf+1×sn+2pf+1nc

Average Pooling

一般在最后一层使用,如将一个 7 ∗ 7 ∗ 1000 7*7*1000 771000的输出变成 1 ∗ 1 ∗ 1000 1*1*1000 111000

Pooling总结

  • ⚠️ 没有需要学习的参数!!
  • 常用的Hyperparameters:
    • filter size: f
    • stride: s
    • Padding: p (用得很少!!)
    • 选一种Pooling: Max / Average Pooling
  • 最常用的Pooling是
    • f=2,s=2,maxpool 等价于 n H / 2 , n W / 2 , n C ′ n_H/2,n_W/2,n_C' nH/2,nW/2,nC

1.10 卷积神经网络示例

  • LeNet-5
    两个卷积层,+Flatten(变成400*1的向量)+两个全联接+SoftMax(多选一)

1.11 为什么使用卷积?

  • 卷积的好处:参数个数比较少
  • 例子:(比较全连接神经网络和卷积神经网络的参数个数)
  • 为什么卷积网络参数个数比较少?
    • 权重共享(Parameter Sharing):一个训练好的kernel在一张图片的各个位置都有用。
    • 稀疏连接(Sparsity of Connections):每一个输出都只和一小部分的输入有关。

你可能感兴趣的:(卷积神经网络(Andrew,Ng),卷积,神经网络,深度学习)