吴恩达深度学习笔记(3)——卷积神经网络

卷积神经网络

边缘检测

  • 过滤器/卷积核(Filter
  • 从图像矩阵中选取与卷积核维度相同的子矩阵,与卷积核矩阵进行元素相乘
  • 设输入一个$n\times n$的矩阵,经过$f\times f$的卷积核运算,输出一个$(n-f+1)\times (n-f+1)$维度的矩阵
  • 例如,一幅$6\times6$的图像矩阵,经过$3\times3$的卷积核运算,变换为$4\times4$的矩阵
  • 一种垂直边缘检测卷积核:

$$\begin{bmatrix}1&0&-1 \ 1&0&-1 \ 1&0&-1 \end{bmatrix}$$

  • 一种水平边缘检测卷积核:

$$\begin{bmatrix}1&1&1 \ 0&0&0 \ -1&-1&-1 \end{bmatrix}$$

Padding

  • 卷积的缺点:经过多层之后,图片会变得很小;图像边缘大部分信息丢失
  • Padding就是在图像周围填充像素点,以克服上述缺点
  • 填充像素的多少采用ValidSame两种方式确定
  • Same是输入的图像和输出的图像维度相同,即

$$n+2p-f+1=n,\ p=\frac{f-1}{2}$$

卷积步长

  • 设步长为s,则输出矩阵的维度是$[\frac{n+2p-f}{s}+1]\times[\frac{n+2p-f}{s}+1]$

卷积的实现

  • 图像和过滤器都有高、宽和通道数,且两者的通道数相等,输出是一个二维矩阵
  • 如果应用了多种过滤器,将它们的输出组合成三维矩阵

$$n\times n\times n_c * f\times f\times n_c\longrightarrow(n-f+1)\times(n-f+1)\times n’_c$$

卷积层

  • 设第$l$层为卷积层
  • $f^{[l]}$为过滤器的维度
  • $p^{[l]}$为padding的大小
  • $s^{[l]}$为步长
  • $n_C^{[l]}$为过滤器的数量
  • $n_C^{[l-1]}$为通道数
  • 每个过滤器大小为$f^{[l]}\times f^{[l]}\times n_C^{[l-1]}$
  • 输入层是一个$n_H^{[l-1]}\times n_W^{[l-1]}\times n_C^{[l-1]}$的图像
  • 输出层是一个$n_H^{[l]}\times n_W^{[l]}\times n_C^{[l]}$的图像,其中宽、高:

$$n^{[l]}=[\frac{n^{[l-1]}+2p^{[l]}-f^{[l]}}{s^{[l]}}+1]$$

  • 激活的单元$a^{[l]}$为$n_H^{[l]}\times n_W^{[l]}\times n_C^{[l]}$
  • m个样本,$A^{[l]}$为$m\times n_H^{[l]}\times n_W^{[l]}\times n_C^{[l]}$
  • 权重$W$为$f^{[l]}\times f^{[l]}\times n_C^{[l-1]}\times n_C^{[l]}$
  • 偏差$b$为$1\times1\times1\times n_C^{[l]}$

池化层

  • 最大池化:选择过滤器大小内的最大值输出
  • 平均池化:选择过滤器大小内的平均值输出
  • 超参数有过滤器大小Filter Size和步长Stride,通常都取2

构建卷积神经网络

  • 一个典型的卷积神经网络包含:卷积层CONV,池化层POOL,全连接层FC
  • 一般在统计网络层数时,只计算具有权重的层,因此把CONVPOOL算作一层
  • 图片输入经过多层卷积后,平整化为一个一维向量,输入到下一层,这一层称为全连接层;全连接层后是softmax函数输出图像分类
  • 随着层数的增加,图片的宽、高通常都会减小,通道数增加
  • 一种常见的CNN模式:CONV->POOL->CONV->POOL->FC->FC->FC->Softmax

为什么要使用卷积

  • 参数共享:图片的每个位置可以使用同一个过滤器提取特征
  • 稀疏连接:每一层的输出值只取决于一小部分输入值

经典卷积网络

  • LeNet-5(Yann LeCun, 1994):早期的CNN模型,可对手写数字进行识别
  • AlexNet(Alex krizhevsky, 2012):使用了ReLU激活函数、Dropout、局部响应归一层(LRN
  • VGG-16(VGG(Oxford), 2014):全部使用$3\times3$的卷积核和$2\times2$的最大池化层,包含16个卷积层和全连接层
  • ResNet(Microsoft, 2015):增加了跳远连接,使用残差块可以训练更深(152层)的网络
  • Inception(Google, 2014):每个Inception模块包含和多个不同size的卷积层(也包含$1\times1$的卷积核)和一个Same的最大池化层,去除了全连接层
  • 这些已经实现并开源的深度网络实例可以在github上下载

迁移学习

  • 将他人开源的训练成果迁移到自己的训练模型上
  • 使用他人训练的权重而不修改参数,称为freeze层,当自己的数据较少时,只训练softmax层,也可以获得很好的性能
  • 自己的数据越多,freeze层越少,自己训练的层数越多
  • 如果自己有大量数据,把开源的权重作为初始化并自己训练整个网络

数据增强

  • 垂直镜像对称
  • 随机裁剪
  • 色彩转换

计算机视觉现状

  • 用于基准训练和赢得比赛的常用技巧(通常对实际生产不实用)
  • 集成:独立地训练几个神经网络,平均它们的输出
  • Multi-crop:分类器在一个图像的多个分割上训练,平均它们的输出
  • 使用已发表论文上的神经网络模型
  • 使用开源的神经网络架构
  • 使用他人预先训练的模型,在数据集上微调

目标检测

目标定位

  • 标签$y$包含的信息包括:$P_c$表示是否检测到目标,$b_x$、$b_y$表示目标中心的坐标,$b_h$、$b_w$表示目标的高、宽,$C_1$、$C_2$、$C_3$表示目标的类别

特征点检测

  • 对于人脸,手工检测的特征点包含眼睛、嘴部、脸部等多个人工标注的特征点
  • 对于人身体,手工检测的特征点包含胸部、肘部等多个人工标注的特征

目标检测算法

  • 训练集是适当裁剪过的图像(例如:车占满一幅图片),标记为1(有目标)或0(无目标)
  • 滑动窗口目标检测:用一个固定大小的窗口以某个特定的步幅遍历图像的每一个区域,然后将窗口扩大重复操作
  • 在卷积网络里,实现滑动窗口要把全连接层变为卷积层,减少重复计算

Bounding Box

  • YOLO算法
  • 把输入图像划分成$S\times S$的格子,每个格子包含$P_c$表示是否检测到目标,$b_x$、$b_y$表示目标中心的坐标,$b_h$、$b_w$表示目标的高、宽,$C_1$、$C_2$、$C_3$表示目标的类别,用在格子中的相对位置和长度表示目标的位置

交并比IoU

  • 监测区域相交的部分/合并的部分称为交并比

非最大值抑制

  • 将所有框的得分($P_c$)排序,选中最高分及其对应的框
  • 遍历其余的框,如果和当前最高分框的重叠面积IoU大于一定阈值,将框删除
  • 从未处理的框中继续选一个得分最高的,重复上述过程

Anchor Box

  • 用于检测多个目标
  • 输出$y$的前8个参数和AnchorBox1关联,后面8个参数和AnchorBox2关联,看哪一个anchor box和实际边界框的交并比更高

YOLO算法的实现

  • 将图像分割为$n$个网格
  • 输出$y$为$[n\times n\times anchorBox\times (5+classes)]$维向量
  • 用非最大值抑制去除冗余的窗口
  • 使用卷积层进行位置检测,全连接层进行目标识别,实现了端到端的学习

R-CNN算法

  • 首先对输入图像运行图像分割算法
  • 在色块上创建窗口,并运行分类器
  • Fast R-CNN:使用卷积层实现了滑动窗口,比R-CNN速度加快
  • Faster R-CNN:使用卷积神经网络实现了滑动窗口,比R-CNN速度大大加快

人脸识别

人脸验证vs人脸识别

  • 人脸验证是1:1比对,精度可达99.9%
  • 人脸识别是1:K比对,将人脸与数据库中的K个脸样本比对,返回人脸的ID

一次识别

  • 在实际应用中,往往只有一张照片,训练样本太小以至于无法进行CNN训练
  • 通常采用相似度进行比较,越相似的人脸,得分差值越小

Simaese算法

  • 用一个卷积神经网络,把不同人脸图片输入,比较其输出的值的范数平方距离作为相似度

Triplet损失

$$||f(A)-f(P)||^2-||f(A)-f(N)||^2+\alpha\le0$$

  • $\alpha$是间隔参数,防止上式恒等于0

$$L(A,P,N)=\max(||f(A)-f(P)||^2-||f(A)-f(N)||^2+\alpha,0)$$

  • 选择的样本尽量使得$d(A,P)\approx d(A,N)$,这样训练起来效率更高

面部验证与而分类

  • 采用逻辑函数对Simaese判定是否是同一个人

$$\hat{y}=\sigma(\sum^{128}_{k=1}W_i|f(x^{(i)})_k-f(x^{(j)})_k|+b)$$

神经风格迁移

  • 代价函数

$$J(G)=\alpha J_{content}(C,G)+\beta J_{style}(S,G)$$

  • 随机初始化$G$
  • 使用梯度下降最小化代价函数$J(G)$
  • $J_{content}(C,G)$用隐藏层$l$计算代价函数,使用预先训练好的模型(如VGG),如果“内容图像”和“输出图像”两个激活值相似:

$$J_{content}(C,G)=\frac{1}{2}||a^{l}-a^{l}||^2$$

  • “风格图像”是一个$n_c^{[l]} \times n_c^{[l]}$矩阵

$$G_{kk’}^{l}=\sum^{n_H^{[l]}}{i=1}\sum^{n_W^{[l]}}{j=1}a_{ijk}^{l}a_{ijk’}^{l}$$
$$G_{kk’}^{l}=\sum^{n_H^{[l]}}{i=1}\sum^{n_W^{[l]}}{j=1}a_{ijk}^{l}a_{ijk’}^{l}$$
$$J_{style}^{[l]}(S,G)=\frac{1}{(2n_H^{[l]}n_W^{[l]}n_C^{[l]})^2}\sum_k\sum_{k’}(G_{kk’}^{l}-G_{kk’}^{l})$$