吴恩达深度学习笔记(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
就是在图像周围填充像素点,以克服上述缺点- 填充像素的多少采用
Valid
和Same
两种方式确定 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
- 一般在统计网络层数时,只计算具有权重的层,因此把
CONV
和POOL
算作一层 - 图片输入经过多层卷积后,平整化为一个一维向量,输入到下一层,这一层称为全连接层;全连接层后是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})$$