Classes 4 卷积神经网络
1卷积神经网络
1 计算机视觉
应用:
- 图片分类
- 图片识别
- 目标检测
- 风格迁移
- .... ...
1.2 边缘检测
边缘检测算子中的数字用于进行边缘检测
计算机视觉不一定要去使用那些研究者们所选择的这九个数字,而是将这 9 个数字当成学习参数
1.3 padding
valid: 不填充,卷积后尺寸变小
same: 填充,卷积后尺寸不变
这也是为什么通常将卷积核设置为奇数的充分原因
1.4 步长
卷积操作:向下取整
1.5 三维卷积
按照计算机视觉的惯例,当你的输入有特定的高宽和通道数时,你的过滤器可以有不同的高,不同的宽,但是必须一样的通道数。
注意:
- 多个卷积核的情况,结果数与卷积核的数量一致。
- 两个过滤器,也就是有两个特征(检测两个特征)。
参数计算:
(每个卷积核的参数+1个bias) * 卷积核的个数
1.6 简单例子
逐层提取特征,在最后一层进行特征展开,为一个向量,输入到逻辑回归或者softmax分类器,得到最终分类结果。
1.7 池化层pooling
除了卷积层,卷积网络也经常使用池化层来缩减模型的大小,提高计算速度,同时提高所提取特征的鲁棒性。
- 最大池化: max pooling 输出的每个元素都是其对应颜色区域中的最大元素值。
最大化运算的实际作用就是,如果在过滤器中提取到某个特征,那么保留其最大值。如果没有提取到这个特征,可能在右上象限中不存在这个特征,那么其中的最大值也还是很小,这就是最大池化的直观理解。
- 平均池化: 选取的不是每个过滤器的最大值,而是平均值
- 一般而言,最大池化比平均池化要常用些,但例外就是深度很深的神经网络,可以用平均池化来分解规模为 7×7×1000 的网络的表示层,在整个空间内求平均值,得到1×1×1000,取代全连接层。
- 输入通道与输出通道个数相同,因为我们对每个通道都做了池化。
- 池化过程中没有需要学习的参数。执行反向传播时,反向传播没有参数适用于最大池化。
池化层的反向传播
需要保证传递的loss(或者梯度)总和不变
- mean pooling: 把一个patch中的值求取平均来做pooling,那么反向传播的过程也就是把某个元素的梯度等分为n份分配给前一层,这样就保证池化前后的梯度(残差)之和保持不变
- max pooling: 把梯度直接传给前一层某一个像素,而其他像素不接受梯度,也就是为0
1.8 卷积神经网络例子
- 人们在计算神经网络有多少层时,通常只统计具有权重和参数的层。因为池化层没有权重和参数,只有一些超参数。这里,我们把 CONV1和 POOL1 共同作为一个卷积,并标记为Layer1
- 常规做法是,尽量不要自己设置超参数,而是查看文献中别人采用了哪些超参数,选一个在别人任务中效果很好的架构,那么它也有可能适用于自己的应用程序
- 找到整合基本构造模块最好方法就是大量阅读别人的案例
1.9 为什么使用卷积
和只用全连接层相比,卷积层的两个主要优势在于参数共享和稀疏连接。
- 参数共享:每个特征检测器以及输出都可以在输入图片的不同区域中使用同样的参数,以便提取垂直边缘或其它特征
- 稀疏连接:依赖于这个 3×3 的输入的单元格,右边这个输出单元(元素 0)仅与 36 个输入特征中 9 个相连接。而且其它像素值都不会对输出产生任影响。
2 实例探究
在计算机视觉任务中表现良好的神经网络框架往往也适用于其它任务, 完全可以借鉴别人的神经网络框架来解决自己的问题。
2.1 经典网络
- LeNet-5 的网络结构
左往右看,随着网络越来越深,图像的高度和宽度在缩小,从最初的 32×32 缩小到 28×28,再到 14×14、10×10,最后只有 5×5。与此同时,随着网络层次的加深,通道数量一直在增加,从 1 增加到 6 个,再到 16 个。
一种模式至今仍然经常用到,就是一个或多个卷积层后面跟着一个池化层,然后又是若干个卷积层再接一个池化层,然后是全连接层,最后是输出,这种排列方式很常用。
* AlexNet
- 这些层分别拆分到两个不同的 GPU 上,同时还专门有一个方法用于两个 GPU 进行交流
- 叫作“局部响应归一化层”(Local Response Normalization),即 LRN 层
- VGG
VGG16在这个网络中包含 16 个卷积层和全连接层
- padding都是same,conv层输出的尺寸没有变化。
- 由 64 翻倍变成 128,再到 256 和 512。作者可能认为 512 已经足够大了,所以后面的层就不再翻倍了。无论如何,每一步都进行翻倍,或者说在每一组卷积层进行过滤器翻倍操作,正是设计此种网络结构的另一个简单原则。
- 随着网络的加深,图像的高度和宽度都在以一定的规律不断缩小,每次池化后刚好缩小一半,而通道数量在不断增加,而且刚好也是在每组卷积操作后增加一倍。
2.2 残差网络ResNet
在残差网络中有一点变化,我们将𝑎[𝑙]直接向后,拷贝到神经网络的深层,在 ReLU 非线性激活函数前加上𝑎[𝑙],这是一条捷径。𝑎[𝑙]的信息直接到达神经网络的深层,不再沿着主路径传递。
𝑎[𝑙+2] = 𝑔(𝑧[𝑙+2] + 𝑎[𝑙])
- 使用残差块能够训练更深的神经网络
- 这种方式确实有助于解决梯度消失和梯度爆炸问题,让我们在训练更深网络的同时,又能保证良好的性能
为什么效果好:
- 残差块最差的效果是与原有的一样(w、b为0),只是多了几层
- 隐藏层单元学到一些有用信息,那么它可能比学习恒等函数表现得更好
- ResNets 使用了许多 same 卷积,所以这个𝑎[𝑙]的维度等于这个输出层的维度。之所以能实现跳跃连接是因为 same 卷积保留了维度,所以很容易得出这个捷径连接,并输出这两个相同维度的向量
2.3 为 1×1 卷积、 Network in Network
作用:
- 1×1 卷积是压缩或增加通道数量,并减少计算量
- 提供非线性函数功能
2.4 inception网络
使用 same 卷积,保持维度不变
- 基本思想是 Inception 网络不需要人为决定使用哪个过滤器或者是否需要池化,而是由网络自行确定这些参数,你可以给网络添加这些参数的所有可能值,然后把这些输出连接起来,让网络自己学习它需要什么样的参数,采用哪些过滤器组合。
28×28×256 的输出。通道连接实际就是把所有方块连接在一起的操作。
- GoogleLeNet
2.5 数据增强
当训练计算机视觉模型的时候,数据增强会有所帮助。
- 垂直镜像
- 随机裁剪
- 旋转
- 扭曲变形
- 局部弯曲
- 彩色转换: R、G 和 B 三个通道上加上不同的失真值
2.6 计算机视觉现状
- 数据量少:传统机器学习方法,手工特征工程,迁移学习等
- 数据量大:深度学习方法
提升基准测试或者竞赛:
- 集成:训练多个分类器,取均值
- multi-crop:对同一张图随机裁剪10次,得到10张图,然后取平均结果
3 目标检测
3.1 目标定位
算法判断图片中是不是一辆汽车,还要在图片中标记出它的位置,用边框或红色方框把汽车圈起来,这就是定位分类问题
目标检测在原有的图像分类基础上又增加了几个输出:边界框𝑏𝑥,𝑏𝑦, 𝑏ℎ和𝑏𝑤,这四个数字是被检测对象的边界框的参数化表示。
标签
:
第一个组件𝑝𝑐表示是否含有对象,如果对象属于前三类(行人、汽车、摩托车),则𝑝𝑐 = 1,如果是背景,则图片中没有要检测的对象,则𝑝𝑐 = 0。我们可以这样理解𝑝𝑐,它表示被检测对象属于某一分类的概率,背景分类除外。
𝑝𝑐 = 1,同时输出𝑐1、𝑐2和𝑐3,表示该对象属于 1-3 类中的哪一类。
损失函数:
3.2 特征点检测
神经网络可以通过输出图片上特征点的(𝑥, 𝑦)坐标来实现对目标特征的识别
准备一个卷积网络和一些特征集,将人脸图片输入卷积网络,输出 1 或 0, 1 表示有人脸,0 表示没有人脸,然后输出(𝑙1𝑥,𝑙1𝑦)……直到(𝑙64𝑥,𝑙64𝑦)。这里我用𝑙代表一个特征,这里有129 个输出单元,其中1表示图片中有人脸,因为有64个特征,64×2=128,所以最终输出 128+1=129 个单元
人体姿态检测,你还可以定义一些关键特征点,如胸部的中点,左肩,左肘,腰等。然后通过神经网络标注人物姿态的关键特征点,再输出这些标注过的特征点,就相当于输出了人物的姿态动作。
3.3 目标检测
滑动窗检测:
滑动窗口目标检测算法接下来会继续处理第二个图像,即红色方框稍向右滑动之后的区域,并输入给卷积网络,因此输入给卷积网络的只有红色方框内的区域,再次运行卷积网络,然后处理第三个图像,依次重复操作,直到这个窗口滑过图像的每一个角落。
- 优点:表现良好
- 缺点:计算成本太高,因为在图片中剪切出太多小方块,卷积网络要一个个地处理。如果间隔步伐太大,显然会减少输入卷积网络的窗口个数,但是粗糙间隔尺寸可能会影响性能
3.4 滑动窗口的实现
不需要把输入图像分割成四个子集,分别执行前向传播,
而是把它们作为一张图片输入给卷积网络进行计算,其中的公共区域可以共享很多计算。
3.5 bound box预测
在滑动窗口法中,你取这些离散的位置集合,然后在它们上运行分类器,在这种情况下,这些边界框没有一个能完美匹配汽车位置。
yolo算法可以获得准确的方格。在图像上放一个网格。基本思路是使用图像分类和定位算法。对于每个格子都指定一个标签y
普通的卷积网络,卷积层,最大池化层等等,最后你会有这个,选择卷积层和最大池化层,这样最后就映射到一个 3×3×8 输出尺寸。所以你要做的是,有一个输入𝑥,就是这样的输入
图像,然后你有这些 3×3×8 的目标标签𝑦。
优点在于神经网络可以输出精确的边界框,但是每个格子只能有一个对象
注意:
- 这和图像分类和定位算法非常像
- 卷积实现,运行速度快,可以达到实时
读不懂研究论文的时候,必须去读源代码,或者联系作者之类的才能弄清楚这些算法的细节
3.6 交叉比IOU
一般约定,在计算机检测任务中,如果𝑙𝑜𝑈 ≥ 0.5,就说检测正确,如果预测器和实际边界框完美重叠,loU 就是 1,因为交集就等于并集。但一般来说只要𝑙𝑜𝑈 ≥ 0.5,那么结果是可以接受的,看起来还可以。
3.7 非极大值抑制
非极大值抑制这个方法可以确保你的算法对每个对象只检测一次
会对同一个对象做出多次检测,所以非极大值抑制做的就是清理这些检测结果。这样一辆车只检测一次,而不是每辆车都触发多次检测。
pc*c1、c2、c3
先用阈值丢弃一些结果
然后去掉所有剩下的边界框,任何没有达到输出标准的边界框,之前没有抛弃的边界框,把这些和输出边界框有高重叠面积和上一步输出边界框有很高交并比的边界框全部抛弃
3.8 anchor boxes
预先定义两个不同形状的 anchor box,或者 anchor
box 形状,你要做的是把预测结果和这两个 anchor box 关联起来。
观察哪一个 anchor box 和实际边界框(编号1,红色框)的交并比更高,不管选的是哪一个,这个对象不只分配到一个格子,而是分配到一对,即(grid cell,anchor box)对,这就是对象在目标标签中的编码方式。所以现在输出 𝑦 就是 3×3×16,上一张幻灯片中你们看到 𝑦 现在是 16 维的,或者你也可以看成是3×3×2×8,因为现在这里有 2 个 anchor box,而 𝑦 是 8 维的。
anchor box 这个概念,是为了处理两个对象出现在同一个格子的情况
对于每个类别单独运行非极大值抑制,处理预测结果所属类别的边界框,用非极大值抑制来处理行人类别,用非极大值抑制处理车子类别,然后对摩托车类别进行非极大值抑制,运行
三次来得到最终的预测结果。所以算法的输出最好能够检测出图像里所有的车子,还有所有的行人
3.9 候选区域
4 特殊应用
4.1 人脸识别
人脸验证与人脸识别的区别
人脸验证问题:如果你有一张输入图片,以及某人的 ID 或者是名字,这个系统要做的是,验证输入图片是否是这个人。有时候也被称作 1 对 1 问题,只需要弄明白这个人是否和他声称的身份相符
人脸识别问题:比人脸验证问题难很多,是1对k的问题
4.2 one-shot 学习
需要通过单单一张图片或者单单一个人脸样例就能去识别这个人, 训练样本只有一个。
不再是分类问题,而是要学习一个能够衡量二者区别的函数
4.3 siamese 网络(孪生网络)
输入不再是一个图片,而是图片对。输出二者的维度为128维,然后比较二者的距离。
损失函数可以:
- Contrastive Loss
- cosine更适用于词汇级别的语义相似度度量
- exp更适用于句子级别、段落级别的文本相似性度量
4.4 Triplet loss
应用三元组损失函数,你需要比较成对的图像。一个 Anchor图片,想让 Anchor 图片和 Positive 图片(Positive 意味着是同一个人)的距离很接近。然而,当 Anchor 图片与 Negative图片(Negative 意味着是非同一个人)对比时,会想让其距离离得更远一点。
anchor与正样本之间的距离小于anchor与负样本之间的距离
为了确保网络对于所有的编码不会总是输出 0,也为了确保它不会把所有的编码都设成互相相等的
𝑎是另一个超参数,这个就可以阻止网络输出无用的结果。
损失函数:
如何构建训练样本:
- 随机选择的话太容易满足约束条件
- 尽可能选择难训练的三元组APN
𝐴、𝑃和𝑁的选择使得𝑑(𝐴, 𝑃)很接近𝑑(𝐴, 𝑁),即𝑑(𝐴, 𝑃) ≈ 𝑑(𝐴, 𝑁),这样学习算法会竭尽全力使右边这个式子变大(𝑑(𝐴, 𝑁)),或者使左边这个式子(𝑑(𝐴, 𝑃))变小,这样左右两边至少有一个𝑎的间隔。
4.5 人脸验证与而分类
最后两个特征进行相减后,再送入logist回归,输出0/1
4.6 神经风格迁移
将使用𝐶来表示内容图像,𝑆表示风格图像,𝐺表示生成的图像
代价函数:
- 内容代价:衡量c与g内容的相似性
- 风格代价:衡量s与g风格的相似性
模型:
- 1.随机生成生成图片G像素矩阵
- 2.利用损失函数更新G像素矩阵值 𝐺: = 𝐺 − 𝜕𝐽(𝐺)/𝜕G
内容代价函数:
- 使用预训练的cnn网络模型抽特征,计算二者的特征距离,将其作为内容代价。
风格代价函数
利用风格矩阵表示各自的风格,然后计算二者矩阵差,求和求均值
训练