一、卷积神经网络

1.1 计算机视觉

举了几个例子,可以完成什么样的任务

最重要的是特征向量太大了,比如分辨率1000 x 1000 的彩色图片,三个颜色通道,维数是 3000000

意味着隐藏层第一层参数是 ( 3000000 , n^[1] )

这样神经网络模型占内存太大了,是需要解决的问题

1.2 边缘检测示例

卷积运算是卷积神经网络最基本的组成部分,本节课以边缘检测为样例说明卷积是如何运算

灰度值 0 到 255,越小越深,越大越浅,0是黑,255是白

卷积运算在数学上设为 *

例如

矩阵  叫作一个 2 x 2 的滤波器( filter ),或者很多地方也叫 卷积核 ( kernel )

(博主觉得好像中文一般愿意叫卷积核,英文一般愿意叫 filter ...)

计算方式就是把滤波器放在图片上按顺序挪动,放在哪里,就对应相乘求和

比方说第一个结果 -1 就是如下这样算的

然后吴恩达给出了一个垂直边缘检测的例子

对于垂直边缘检测,可以用  这样一个滤波器

其效果就是用白色区域标识处垂直边缘,当然这个看着有点粗,因为相对于 3x3 的滤波器我们的 6x6 图片太小了,图片大的话效果就会很好

1.3 更多边缘检测的内容

你可能会发现这张图片左右翻转过来,输出的边缘就不是更白的了,而是更黑

实际上这不重要,我们只关心数字,总之深度学习会知道卷积运算结果 绝对值大的 是边缘

水平的话就旋转 90 度即可,如图所示

实际上卷积运算后不仅仅标明了边缘,还能通过正负表明哪边暗哪边亮

如图我们呢滤波器用 上亮下暗

运算结果 边缘为亮,则说明 图片边缘以上亮,边缘以下暗

运算结果 边缘为暗,则说明 图片边缘以上暗,边缘以下亮

关于滤波器具体参数用多少也有过争议

如图所示是 Sobel Filter 和 Scharr Filter

Sobel Filter鲁棒性强一点,Scharr Filter 拥有一些不同性质,但吴恩达没具体讲

但不论怎么说,如今一般都是选用下面这种方法

直接给滤波器全设上参数,通过学习来获得参数值

事实证明这种非常好用,比如你想要检测检测斜着边缘,比如45度,那你就用斜着45边缘的标签来训练,就能得到一个这样的滤波器

1.4 Padding

首先博主要说的是,对于图片和卷积核,一般都是用方阵,一方面因为懒方便,另一方面可能效果确实好一点点

然后是卷积核大小一般奇数,这样利于 Same 卷积的 Padding,并且奇数方阵它是有中心的,当然吴恩达指出这些或许是原因,但并不充分,大概实际上只是惯例罢了,推荐就是只用奇数大小

那么下面讲 Padding

如图所示,图片矩阵 ,卷积核大小 

那么直接卷积得到的结果维数是 

这样的问题在于你会发现,图片外边缘被卷积次数很少,边角甚至只用了一次,中间卷积次数很多

图片边缘的信息有丢失,于是我们可以 Padding 填充

如图所示的是  的 Padding,即填充了一个像素点,注意一个像素点是这样一圈

图中的就是 6 x 6 变成了 8 x 8,然后灰度值可以用 0 就行

如果你想的话也可以是 p = 2 或其他值,这样就解决了边缘丢失的问题

卷积结果的维数是 

实际上我们有名字来形容这些卷积

Valid padding:不填充直接卷积,输出大小 

Same padding:填充使得输出大小为 ,填充像素点数为 

1.5 卷积步长

我们之前的课里讲的是步长为 1 的情况,图中展示了步长为 2 的情况,就是上下左右的挪动都一下挪 2 步,需要注意有时不一定整除,可能挪出一半,这种的就不要了,于是结果的维数就是向下取整

填充padding为 p,步长stride为 s

最终的结果维度公式为

然后要说的是,数学领域把我们做的 卷积 运算叫作 互相关,他们把 水平且垂直都反转的卷积核用来做的卷积叫作 卷积,如图所示

这样好像是在信号处理什么的领域比较有用

吴恩达说我们不用管这个,我们就正常按原来做按原来的的叫卷积就可以了,机器学习领域文献都这样叫

1.6 卷积为何有效

这节课的标题有点迷,感觉和内容对不上,总之就这样吧

看图,对于 RGB 图片,可以看作一个立方体,三个维度叫作 高度 x 宽度 x 通道数(深度)channels

通道数有些地方叫深度,吴恩达建议不这样叫,因为这容易和神经网络的深度混淆

然后输入有几个通道,卷积核就有几个通道,就可以看作两个立方体的卷积

不同通道的卷积结果直接加和,卷积结果还是那样一个平面方阵

其作用,比如上图,R是垂直边缘,G、B都是0,那么就实现了红色通道的垂直边缘检测

再比如这样,就是所有垂直边缘的检测

自始至终有一个问题我们一直未提到,我们前面讲了边缘检测,实际上一个卷积核只能检测一个角度的边缘

如果我想检测多角度的边缘该怎么办呢

如图所示,一个卷积核结果是一个平面

两个卷积核是两个平面,可以合起来作为两个通道的立方体

于是总结一下,假定不做padding,也不更改 stride,维度就是这样

其中  是你使用的卷积核个数,也是输出结果的通道数

1.7 单层卷积网络

本节课主要是了解卷积层的计算过程

输入层一张图写成一个向量看作一个 x,或说一个 

比如第一层是卷积层,卷积核的所有参数构成一个参数 W,即  个参数

当然注意还有 b,利用 python 广播,每一个通道的 Z 加上同一个 b,即加一个 b 向量

显然卷积核的参数数量只与卷积核大小,和输入通道数有关

换言之,无论图片分辨率多大,参数都是这些,换言之本课程开课所说的参数多的问题解决了

卷积计算后的立方体,再套上 激活函数,就是这一层的激活值

这里我们总结确认一下符号和维度

第  层,卷积核大小filter size ,padding ,步长stride ,卷积核数量 

记输入即上一层输出的激活值为 ,设其维度 

本层输出激活值 ,则维度为 

其中,

本层卷积核维度 

本层参数 W 的个数 = 卷积核维度 x 卷积核个数,即  

本层参数 b 的个数 

1.8 简单卷积网络示例

举了个简单的例子,不断用卷积层卷积卷积,当立方体足够小了,一个立方体就可以直接在输出层 flatten 平整化成一个列向量,用一个 sigmoid 或者 softmax 激活一下即可输出

一般只用 Convolution(CONV)卷积层也会很好,但大部分神经网络架构师依然会添加 Pooling(POOL)池化层 和 Fully connected(FC)全连接层,这些接下来几节课会讲

1.9 池化层

池化层的作用:缩减模型大小,提高计算速度,提高提取出的特征的鲁棒性

举例,比如 Max Pooling,最大池化,对每个 f x f 的子阵提取其最大值

例如卷积核大小 f = 2 ,步长 s = 2 时,下例矩阵中的矩阵便做了一个最大池化

除了 Max Pooling 外,还有 Average Pooling,字面义不解释了

池化层一般都是用 Padding p=0,不做填充

然后注意池化层不需要训练,没有参数,只有超参数,所以很快

一般取 f = 2,s = 2,有时也用 f = 3,s = 2,通过交叉验证调即可

输入几个通道,输出就几个通道,分别对每个通道矩阵做池化即可

维度上,依然是卷积的结论,毕竟还是那样的子阵窗口在上面挪嘛

就是对输入维度 

输出维度是 

注意看这个维度,s = 2 实际上就实现了高和宽的维度减半

1.10 卷积神经网络示例

全连接层就是普通的神经网络那种下一层的一个 z 由上一层每个激活值线性组合得到,就是我们以前学的那种。

然后就是一般来讲,都是一开始卷积层和池化层来回用,然后 flatten,然后只用全连接层,最后输出层,这样的架构

吴恩达本节课举了一个例子是,LeNet-5 的翻版,LeNet-5 是 1998年LeCun提出的用于手写数字识别的灰度图像的CNN架构,其特点是麻雀虽小五脏俱全,如图所示

把维数和参数数量整理成表格如图所示,其中未标注的 p=0


然后吴恩达表示习惯上把有参数的叫一层,需要注意 POOL 没有参数,于是他会把 CONV1 和 POOL1 合起来叫作第一层,也有些文献会把 POOL 看作单独一层,这个就喜欢怎样就怎样来吧,我是觉得后者比较舒服

1.11 为什么使用卷积

大规模神经网络需要更多训练数据本质其实是因为参数多,参数太多实际上也会加深过拟合

卷积的特点在于其可以大幅减小参数,从而我们可以用更小的训练集,并且可以更好的防止过拟合

卷积减少参数的具体方法可以概括为两条 参数共享 和 稀疏连接

参数共享:首先是我们知道,卷积核多少个参数,跟图片大小无关,换多大的图片都可以这样用。其次是比如垂直边缘检测器,就那 9 个参数,放在哪都是那样,任何场景下都不带变的

稀疏连接:我们输出的立方体每个数就是把覆盖的合一下,比如你用垂直边缘检测器,我们想要的结果形式就是那样,每 9 个合一下,就这 9 个稀疏连接,于是也就只要这 9 个参数

卷积还有一个好处叫 善于捕捉平移不变,比如你把猫的图片向右平移两个像素,最后的预测完全不会受影响的。

实际上博主觉得这个完全可以想象,只用全连接的话,就像特别单纯地看图片矩阵的数字一样,放大缩小平移旋转这些对数的变化影响挺大的,这种不仅难训练,而且应该会严重过拟合,可以想象的,而卷积就像基于边缘的图片预测,有一种把图中物件绘画出来形状去预测的感觉

二、深度卷积网络:实例探究

本周应该是深入学习一些案例架构,这个标题翻译好像有点问题,感觉像在说DCNN一样

2.1 为什么要进行实例探究

通过一些已知问题的架构,我们可以把某些合适的架构直接拿来用,或者学习其中的设计思路

2.2 经典网络

要学的有 LeNet-5、AlexNet 和 VGGNet

LeNet-5(1998年、手写数字识别、灰度图像识别)

超参数( valid padding p = 0 ) 激活值维度
Input 32 x 32 x 1
CONV1 5 x 5, s = 1( 6个 ) 28 x 28 x 6
POOL2 f = 2, s = 2, avgpool 14 x 14 x 6
CONV3 5 x 5, s = 1( 16个 ) 10 x 10 x 16
POOL4 f = 2, s = 2, avgpool 5 x 5 x 16( flatten = 400 )
FC5 n = 120 120 
FC6 n = 84 84
Output n = 1 1( 线性激活函数 1 到 10)
备注 约 6 万个参数。需要注意输入层分辨率大小多少也是有好坏有讲究的。然后除了输出层,激活函数均为 sigmoid或tanh,吴恩达没具体指出,我个人觉得隐藏层无脑 tanh 就好。当时比较喜欢用 avgpool,现在大家都喜欢用 maxpool。当时还没人用 padding,所以维度持续递减。当时还没有 softmax,所以用的 RELU,现在这个问题的输出层肯定用 n=10 的 softmax。随着卷积和池化,一个好的结果往往伴随着 高、宽大幅减小,通道数大幅增多。

AlexNet(2012年 ImageNet 竞赛冠军)

备注:注意看其中用了maxpool、same padding、softmax输出层。原文输入是 224 x 244,吴恩达表示可以推导出 227 x 227 更好。AlexNet 参数约 6000万个,用了 ReLU。当时 GPU 比现在慢很多,它用了很复杂的方法讲这些层拆分到两个 GPU 上计算,还专门用一个方法让两个 GPU 间交流。AlexNet 中还使用了 LRN 局部响应归一化层,这个层应用的很少,后来研究者发现其作用并不大,所以吴恩达表示图中他给删掉了。AlexNet 使得CV领域开始重视起深度学习,这个网络挺复杂的,值得学习。

VGGNet(2014年 ImageNet 竞赛亚军、2015年发表)

备注:各个卷积层超参数全一样,各个池化层超参数全一样。共计约 1.38 亿个参数。论文中包括 VGG-16 和 VGG-19,图中给出的是 VGG-16。VGG-16 规模很庞大,VGG-19 更加庞大,但二者性能上差不多,所以一般人都会选择 VGG-16。这篇论文最有吸引力的一点是,它表示高宽的减小与通道数的增加成比例的话就会很好,如图所示实验结果就是宽高总是减半,通道数总是二倍

2.3 残差网络

残差网络 ResNet(2015年)

公式是每两层把两层前的一个激活值加在一起激活一下 

称作跳远连接,或者 残差连接,两层的一块称作 残差块

如图所示是 ResNet 的模型

对不带残差的网络,称之为 Plain Network

对于 Plain Network,理论上来讲是绿线那样,层数越多网络规模越大,训练效果就越好,然而规模大了,数据需求量大了,迭代次数要的也多了,训练变得更难了,实际上很难训练到理论效果,实际上随着层数增大,反而是蓝线那样,效果变差了

而如果用 ResNet,深层网络就可以很好地提高效果了

2.4 残差网络为什么有用

展开后,

假设 g 用 ReLU、W = b = 0

那么 

恒等函数好训练,大概意思就是两层效果不好,那他就会训练出 W、b 趋近0,让恒等的这个成为主要成分,实际上就相当于那两层被跳过了不存在,你看 a^[ l ] = a^[ l - 2 ] 不就是这个意思嘛,中间两层相当于没有,这也是为什么残差网络能够保证深层效果

然后还需要注意我们主要在卷积层中使用,然后涉及的一个问题就是你一定要用 same padding

2.5 网络中的网络以及 1 x 1 卷积

2013论文,network in network

1 x 1 卷积看起来没啥用,你看输入一个矩阵,他不就是给每个元素乘了个倍数吗

错,这个想法大错特错

一定要考虑进通道数

回忆多通道卷积运算怎么做

输入几个通道,卷积核就有几个通道,对不同通道分别做卷积运算,然后加和得到一个矩阵

那么一个 1 x 1 x nc 卷积核实现了什么

想象一下,它把同一位置的不同通道按一定权重线性加和到一个通道并激活

所以实际上它是很有用的

然后一个重要的应用是什么,如果你只想压缩 nc 这一维该怎么做

显然,你用几个 1 x 1 x nc 的卷积核,就会把 nc 压缩到几个通道

2.6 谷歌 Inception 网络简介

2014论文,going deeper with convolutions

Inception层的作用:代替人工判断是用卷积层还是池化层,卷积核大小用多少

如图所示的就是 Inception 层,用 1 x 1 还是 3 x 3 还是 5 x 5 还是做 maxpool,用一个 samepadding 让他们输出宽高相同,然后直接按通道摞起来就好。哪个没有不好用,那训练出就是趋近 0,哪个好用那权重占比就高,靠它自己学习用哪个怎么用,这就是 Inception 层

做池化的时候有通道数问题,这个下节课讲

一个问题是,这个显然增加了计算量,计算复杂度大幅增加,那要怎么办

上图中的维数,做了多少次乘法呢

怎么算呢,输出的一个数是整个卷积核盖上去的对吧,也就是输出的每个数做 5 x 5 x 192 次乘法

共计 28 x 28 x 32 x 5 x 5 x 192 次乘法,约 1.2 x 10^8,实在太大

解决方案是什么呢,就是上节课学的 1 x 1 卷积压缩通道数,如图所示

中间加了一个 1 x 1 卷积,称作瓶颈层

乘法次数 28 x 28 x 16 x 1 x 1 x 192 + 28 x 28 x 32 x 5 x 5 x 16 约 1.2 x 10^7 缩减了 10倍

你可能会想性能会不会变差呢

事实表明,只要瓶颈层设计的合理,就可以在保证性能的前提下,大幅降低计算代价

这就是 1x1 卷积瓶颈层降通道维数的一个最大的作用

2.7 Inception 网络

如图所示,卷积前加入了瓶颈层

然后池化有个问题是输入多少通道输出就是多少通道,这样池化占比就太高了,于是压缩通道数嘛,很简单的一个处理方法就是池化后加入一个瓶颈。至于为什么是池化后加瓶颈,而不是池化前,这个不用讲我觉得也能理解,实际上也算是一个结论了,肯定要池化后瓶颈

然后这一坨东西叫作 Inception Model 即 Inception 模块

如图所示的就是 Inception 网络

实际上就是由 Inception 模块堆叠而成,然后有意思的是,在隐藏层还加入了一些全连接+输出层分支,在中途也可以给出预测,这确保了在隐藏层也能给出不错的预测,降低了过拟合

然后现在 Inception 版本也越来越多,还有一个 Inception LeNet 致敬 MNIST 的 LeNet,不论如何变式,其核心都是我们学的 Inception Module,是我们需要掌握的

2.8 使用开源的实现方案

吴恩达教我们要学会用 GitHub 复现,大概就是这意思吧。。

找到你感兴趣的开源资源库,点 Clone & Download 获得 url

然后 cmd 里 cd 到你的文件夹,然后 git clone 你的url 就下载下来了

2.9 迁移学习

在上一个课程的 2.7 中已经讲过基本概念和原理

那么实践中,我们要做的就是把整个别人的代码和权重全都下载下来

你的数据很少,那可能就改个 softmax 层,前面的都 freeze 冻结掉

再大一点,就改后几层。再大一点,可能就再输出层前增加一些隐藏层

当然我觉得这和两个任务间的相关性也有关,按上一个课程已经讲过的来思考就好

2.10 数据扩充

data augmentation 数据增强,或者也可以翻译成数据扩充

在第二个课程的 1.8 的正则化方法中简单介绍了 数据增强,数据增强确实有降低过拟合的效果,但其根本目的还是扩充数据规模,主要就是用于数据量需求大的CV领域

相比之前,本节课更加系统地讲了几种数据增强的方法

常规增强方法:第二个课程 1.8 也讲了,水平翻转,随机剪裁,放大,轻微扭曲等,垂直翻转一般不能用,扭曲比较麻烦,用的也比较少

色彩转换:或者叫颜色增强,是加一定的颜色失真值,如图所示

实际上颜色增强并不是随便增强,而是有目的性的,遵循一定的分布的,比如太阳光比较强的环境,或者日光灯下的环境,你这样就可以人工制造出来,增强了对照片颜色更改的鲁棒性

实际上有一个非常好的处理方式是利用 PCA 主成分分析,分析出 R G B 中哪几个是主成分,即那几个偏多,就去把他减小,或者把另外的增大,这样一个增强方式就很好

AlexNet 论文中有 PCA 颜色增强的现成方法,我们可以直接使用它

然后最后讲了实际使用过程中,充分利用并行性,启用一个 CPU 线程做数据增强/扭曲,传送给 CPU/GPU 主线程,主线程做训练

2.11 计算机视觉现状

简单概括一下就是图像识别数据很少,然后目标检测更少,目标检测就是把图像中的目标框出来

知识的来源是监督的(有标签)数据,或人工特征/人工网络体系结构/人工设计的系统其他组件

数据少的话就会高度依赖人工特征工程

一些在 基准测试 benchmark / 赢得比赛中 常用的方法:

首先是,Ensembling,就是我们天天用的模型融合啦,吴恩达的例子是训练几个不同的神经网络,然后取平均,吴恩达表示,在系统中并不应该用,除非你有很大的计算预算,或者并不介意在每个用户那浪费计算时间

其次是,测试时使用 multi-crop,即测试时用数据增强,一般有助于调参提高预测效果。常用的是 10-crop

如图所示,即截取中心和四角,共计5个截图,及其左右翻转镜像,共10个

最后吴恩达给出了实践时的建议,其实之前也讲过

第一,使用文献中现成的网络架构

第二,如果可能的话使用一些开源的实现

第三,使用预训练的模型并在你的数据集上微调

三、目标检测

3.1 目标定位

如图所示的是 图像分类问题、定位分类问题、目标检测问题

图像分类即是不是车,定位分类即把车框起来,这两个都是单目标

目标检测,比如检测图片中所有的车、所有的行人,当然这两个之间是区分的。图中的车是多个,或者人、车类别多个,你一次要同时定位分类图片所有存在的一个或多个目标,这就是多目标问题

单个目标的图像分类算法,比如分为行人、汽车、摩托车、背景互斥的四类

输出标签就是 4 个结点的 softmax

如果是定位分类呢,输出标签就是

Pc:是否目标,即 1 表示是目标,0 表示是背景,当为 0 时,其他项不存在意义,不纳入参考

bx、by:红框中心

bh、bw:红框高宽

c1、c2、c3:是否行人、是否汽车、是否摩托车,c1、c2、c3 之间是互斥关系,至多一个为 1

损失函数如下所示,平方误差,背景时不看其余输出

然后注意坐标怎么标记的,图片左上角坐标为  ,右下角为 ,比如图中框起车的红框就是 bx、by、bh、bw 值为 0.5、0.7、0.3、0.4

然后 Pc=0 是背景嘛,其他结果就没啥意义嘛,可以给它标个问号啥的不去关心,当然我也不清楚python里能不能给标签弄问号这种东西,总之吴恩达就是这样写的,了解一下

 ,这个就是背景图的真实标签

3.2 特征点检测

如图所示,就是要什么标什么特征点

比如第二幅图要检测面部所有特征,就比如眼角鼻子嘴角之类的你都标上特征点,让他们连起来就是那些面部器官的特征点就行

然后标签就和上节课思想类似,第1个标签是否人脸,然后你可能有64个特征点128个标签,共计129

再比如右图,检测人物姿态,就像红线那样去选一些点

说实话真不容易,训练集的来源就是这样人工一点点标注出来的

3.3 目标检测

目标检测的一个方法是方形的滑动窗口,对窗口内做图像分类,先从小的窗口,然后按一定步幅,这个步幅小于边长,换言之每次挪动到的位置会重叠,然后就这样遍历完整张图片,然后接着再来更大一点的窗口,这样重复。一个问题就是训练一个都不是很快,别说这么多窗口了,实在是太慢了,你只用大窗口,那窗口数太少,太粗粒度,根本没法准确定位。所以这个方法已经淘汰了,现在已经有了更好的优化方法。

3.4 卷积的滑动窗口实现

首先要讲的是,全连接转卷积

由输入维度 n - f + 1 可得,f = n 时输出维度 1 x 1,即输出一个数

n = f,就是一个和输入一样大的卷积核,正好盖在输入上,想象一下,这恰好就和全连接得到一个结点一样

于是用 nc 个卷积核输出便是 1 x 1 x nc,nc 就是该全连接层的结点数

这样就实现了第一步的全连接转卷积,接下来的全连接转卷积只需要 nc个 1 x 1 卷积核即可

全连接转卷积的好处是保留了立方体特性

接下来要讲的是如何用卷积来实现滑动窗口,这里略微有点难,一定要搞懂

2014年论文《如图所示》

如图所示,第一行是我们的全连接转卷积,它是我们设计的用于单目标图像分类的一个神经网络,维数上,图中没标明的需要注意 maxpool 用的是 s=2

好,接下来第二行,首先我们要了解,对于输入中的一个子图,在输出中对应的子图的位置是可以计算出来的,一个快速判断的结论就是,比如如图,我们的子图在左上,其右和下有两个像素点,那么若步长 s=1,输出也会是右和下有两个像素点。如图 maxpool s=2,于是整体缩小了一半。

注意看这个第二行,左上角标出的正是我们第一行单目标分类的那部分,你可以看到第二行卷积最后的四个方块实际上就是 16 x 16 这个原图的 左上、右上、左下、右下 四个 14 x 14 部分

换言之我们利用卷积实现了 14 x 14 区域的步长为 2 的滑动窗口

和滑动窗口的区别在于,不妨设想第二行,如果用滑动窗口做,第二步将是 4 个 10 x 10 x 16,而我们用一个 12 x 12 x 16 就搞定的,实际上卷积帮助我们去掉了很多重复计算的部分,图片越大卷积解决滑动窗口的效果就越明显

换言之我们只需要定好我们的窗口大小,对这个大小做好单个目标的图像分类的神经网络,并将其中的全连接转卷积,即可直接用于更大的图片,来实现卷积实现的滑动窗口

那么滑动窗口步长是怎么确定的,那是我们所有过程中的卷积和池化的步长乘积所决定的,如图所示,步长是 2,是因为我们 maxpool 的 s=2,其余 s 都是 1。实际上滑动步长不是完全自由的,这受我们单目标图像分类设计的卷积和池化的步长所影响。但是有一个部分是可以自由调节的,注意看第一个FC全连接层这里的卷积步长完全没额外影响,其完全是用于调节滑动步长倍数的,当然只能做整体倍数变化,毕竟滑动步长是整个网络步长的乘积。

3.5 Bounding Box 预测

首先博主要补充强调的是,对于前两节课,滑动窗口用的是图像分类,而非定位分类

滑动窗口+图像分类,它最后预测出的目标的边框就是那个窗口,问题在于,它是一个正方形,你这个挪动的正方形可能总是无法框起完整的车,或者框太大了,总是无法完美匹配,更进一步地,可能方形总是无法精准,实际上长方形更好

显然你会觉得要用 滑动窗口+定位分类,实际上定位分类的发明在滑动窗口之后,所以就产生了那样的现象,而且那么多大大小小重叠的窗口实际上就是比较适合图像分类,定位分类反而多余,产生了太多不必要的计算浪费。对于定位分类,理应用更好的窗口方法,这就是我们这节课要学的,然后预先要说的是,前面许多结论,尤其上一节课的很多想法我们还要用的,不要忘记了

YOLO算法(2015论文,如图所示)

YOLO即 you only look once

如图所示把图片分成 3 x 3 网格,对每个网格做定位分类(一般用 19 x 19 效果比较好,本节课暂且用 3 x 3 来说明 )

然后对一个网格,如果它含有目标中心,那真实标签就被认为是含有目标,否则认为是背景,然后宽和高可能超过网格边界嘛,所以 bh 和 bw 是可以大于 1 的。然后很有意思的是 19 x 19 的话,宽和高甚至可能有好几个网格那么大。

然后说实话我没太看懂过程原理

吴恩达意思好像是对这个图对给定输入 100 x 100 x 3,只要最后输出是 3 x 3 x 8,然后真实标签对应上,最后就能实现这个预测,优点是不受步长限制,完全没理解原因说实话,我也不知道这个做法的意思理没理解错,我是觉得步长是有限制的,得调整成 100/3 这个滑动步长

说实话问题很多,大概了解一下这些方法,有个大致思路就好吧,想搞细节还是得看原论文

细节研究应该挺难的,尤其这篇论文,吴恩达自己都说了很难,当时还和很多研究员一起探讨

3.6 交并比

两个边界框的重合度,采用集合论的交并比方式(交集比并集)

如图所示,交并比 Intersection over Union,简称 IOU

一般 IOU >= 0.5,认为检测正确,如果你想更严格一点,就把它设的更高一点

3.7 非极大值抑制

前面几节课有一个残留的问题是,比如使用滑动窗口,有很多重叠的框检测出同一个目标,那么对这个目标该选用哪一个框呢。再比如 YOLO 算法,可能临近的好几个都举手说我是中心,我预测到了目标,那么这时候该选哪一个呢。于是这就是这节课要解决的问题。

首先回忆不论是 sigmoid 还是 softmax 输出的分类都是概率对吧

那么以 YOLO 算法为例

首先说一下图中 pc 是简写,应当用 pc*c1、pc*c2、pc*c3 分别分三次讨论,即每个类别要单独讨论,我们暂且就用简写的 pc 来说

非极大值抑制算法就是

首先所有 pc <= 0.6 的网格认定为预测的是背景,直接丢弃

然后按 pc 从大到小降序快排我们的输出

拿一个最大的 pc,选中这个框(注意我们前面讲过,预测出的框可能比网格本身大很多很多)

然后再拿下一个 pc,和以前我们选中的每一个 pc 做一次比较,如果二者交并比 IOU >= 0.5,那么认为二者框的是同一处目标,且原来选中的 pc 较大的那个位置更精准,于是丢弃这个 pc。若和以前的每个 pc 间 IOU 都 < 0.5,则证明这个 pc 描述的是一个新目标,则选中

重复上述操作,直到处理完全部 pc

当然这里比较的阈值你可以按严格程度的需求你自己来调

3.8 Anchor Boxes

在我们之前学习的算法中,还有一个什么问题呢,回忆前几个课程讲过的有关 softmax 原理的内容,回忆分类定位问题标签的定义

c1+c2+c3 等于 1 对吧,那么当一个网格同时含有两个类别的中心,我们就没法预测了对吧

那要怎么处理呢,很简单

这样重复两遍就好了,共 16 维,第一个 8 维叫 anchor box 1,第二个 8 维叫 anchor box 2

比如人和车,那就第一个专门人,第二个专门车,这样就能处理含多中心问题了

然后比如不含人的中心,含有车的中心,那就真实标签第一个可能就背景,pc=0,剩下问号,然后第二个就是pc=1 且 c2=1 这种的

实际上我觉得比如会不会两个人中心在同一个网格里呢,那这个算法还是没能彻底解决多中心问题

不过吴恩达表示 19 x 19 的话,网格很多,中心落在同一格的概率太小了,可以不考虑的,实际上这个算法实用性没那么大,确实

本节课还是 YOLO 那篇论文里的,不上图了

3.9 YOLO算法

这节课就是串连了一遍,把前面分步学的连成一个完整的过程,我觉得没啥好说的了,不写了

四、特殊应用:人脸识别和神经风格转换

4.1 什么是人脸识别

区分人脸验证( Face Verrification )和人脸识别( Face Recognition )

人脸验证是一对一问题( 1:1 problem ),人脸识别是一对 K 问题( 1:K problem)

人脸验证:输入一张图和一个姓名/ID,输出判断输入图像是否姓名/ID声明的那个人

人脸识别:你拥有 K 个人的数据库,输入一张图,输出判断输入图像是否 K 个人中的某个人

人脸验证达到可能 99% 就可以接受,但是人脸识别是 K 个人综合的出错率,那可能就需要用 99.9% 的人脸验证才行,这就导致人脸识别比人脸验证难很多

4.2 One-Shot 学习

one-shot 这个单词翻译为只有一次的

我们的人脸识别往往是一次学习,意思就是我们的训练样本可能只有 1 个

想象一下 K 个人,如果用 CNN,输入一张图片,最后 softmax 输出单元数 K+1 个( 注意有K个人都不是的情况 ),这样一个网络是很庞大的,仅仅用 K 个样本实现 K+1 分类,数据量实在是太少了,效果肯定非常不好,而且员工变动怎么办,不就只能重新训练吗,所以不能用 K+1 分类

解决方案是用一个 similarity fuction 相似度函数

设计一个  函数来计算两张图片间的不同程度

设一个很小的阈值 ,当  时,认为相同, 时认为不相同

这样就是训练 d 来调整网络参数,实现两个人一样 d 就很小,两个人不一样 d 就很大

预测的时候就是遍历 K 个人数据库图片,数据库图片和输入图片作为神经网络输入,计算相似度

这样就解决了我们用分类方法所面对的两个问题

4.3 Siamese 网络

2014论文《如图所示》

对一个分类的人脸识别网络,去掉 softmax 层,我们相信上一层的向量是一个对输入图像的很好的编码,就用这个原本的倒数第二层向量作为输出向量,即用这个 encoding 向量代表这张图片

如图所示,我们的这个网络就是这样两个网络,输入两张图片,输出两个 128 维编码向量

对输入图像  的输出编码向量记作 

我们用两个编码差值的第二范式( 见第二个课程 1.4 正则化 )作编码间距离,即

这个 d 就相当于代价函数,按下面的规则来训练:

  是同一个人,则 d 很小

  不是同一个人,则 d 很大

从而学习网络中的参数

当然我觉得这篇论文只是一个开端,更侧重于一个新思路新想法,实际应用的话,其实你可以想象一下这个 d 是大是小设计起来就很玄学,难以从理论界定,所以关于代价函数的更进一步设计就有了我们的下一节课

4.4 Triplet 损失

2015论文《如图所示》

对一个人的图片,我们总是拿它来比较的,称之为 Anchor,祖先简写为 A

和它是同一个人的图片,为 Positive,简写为 P,和它不是同一个人的图片,为 Negative,简写为 N

代价函数我们可以一次传 APN 三个图,通过三元组来实现,具体如下

显然我们知道 

移项后为 

而且  越小越好, 越大越好,那么显然  越小越好

于是  用来做损失函数是合适的

回忆 log 极大似然估计,损失函数其实是不应当小于 0 的

那么一个问题就是可能会训练出  这种东西

于是加一个 margin parameter 间隔参数 α 即可

即 

即 

于是,损失函数为

代价函数为

然后下一个问题就是训练数据怎么设计

比方说你有 1k 个人的 10k 张图片,那么显然每个人都有好几张图片,你的一个样本是一个 APN 三元组,每个人都有一个选定的 A,然后你挑一个做 P,挑一个做 N,就是一个样本

关键在于如果很轻松就能让 同一人的距离大,不同人的距离小,那效果必然不好

我们要加大训练难度,尽可能设计的数据让 

换言之希望设计的数据  大一点, 小一点

即同一个人的不像的照片会比较适合训练,不同人比较像的照片会比较适合训练

4.5 面部验证与二分类

2014年论文,《如图所示》

人脸识别后的网络后面加了一个 sigmoid 单元,这样就把人脸识别方法应用于人脸验证了

效果也很不错

4.6 什么是神经风格转换

Content(C)、Style(S)、Generated image(G),如图所示

4.7 深度卷积网络在学什么

2013论文《如图所示》

第一个课程的 4.4 也讲过类似的内容

我们想知道神经网络的隐藏层都在干些什么,于是我们可以可视化成图片

那么你会注意到一件事情,通道数很多呐,而且隐藏单元的计算结果也并非 0 到 255,根本也没法看作图片,没法直接可视化的

那怎么办呢

方法是,比如隐藏层第一层,你从图中 110 x 110 x 96 个隐藏单元中选一个,然后回忆算 Z 算 A,你从所有激活这个单元的训练数据中,找到九个将其最大激活的图片/图片块,这就是其主要表示的内容

所谓最大激活项,我的理解就是 W 比较大的对应的那些项,权重大占主成分嘛

如图所示选择了第一层的九个隐藏单元,并选出了每个隐藏单元最大激活的九个图片块

可以第一个被选的隐藏单元里表示的是左上到右下的斜边缘,第二个是左上角的斜边缘,第三个是比较接近垂直的垂直边缘,第四个是橙色,第七个是绿色

然后第一个课程的 4.4 讲过,第一层表示的可能就是一些简单的特征,比如边缘之类的,然后层数越深,其特征越细致

再比如深层一点,可能一个单元预测了风景图中的所有狗头,另一个单元可能预测了风景图中的所有车门等等。

关于隐藏单元怎样选,肯定要靠试,我想实际上最多一个输出通道选一个就行了,回忆初学CNN的内容,实际上一个卷积核专门预测一项内容对吧,大概就是这样

4.8 代价函数

标题可能起的不太明确,本节课讲的是神经风格迁移算法的代价函数

2015论文《如图所示》

代价函数

 内容代价函数, 是风格代价函数,关于这两个代价函数会在下节课讲

α、β 是超参数,实际上一个就行了,为了和论文原作者保持一致,于是写作 α、β

如图所示,我们要做的就是 G 随机初始化成白点噪声图,然后直接梯度下降就行了,注意我们的神经风格迁移其本身并不需要设计神经网络,就是直接对代价函数梯度下降即可

然后随着梯度下降次数,可视化效果就是右图那样,一点点变成融合后的图像

4.9 内容代价函数

如图所示,思路就是利用我们前面学过的全部内容

目标是让 C 和 G 的内容相似度高

于是就需要 encoding,于是你就需要迁移学习,拿一个现成的图像识别的预训练模型来用,比如VGG等

单纯内容上的相似度,一般选取一个既不是很深也不是很浅的隐藏层比较好,这个层数 l 你自己选,用第 l 层来作为 encoding 向量

然后用 1/2 第二范式作为内容相似度距离即可,如图所示,即

4.10 风格损失函数

实际上内容代价函数很好理解,就像人脸识别一样,风格该怎么办呢

不妨想象一下,同一张图,对垂直边缘的预测,和对橙色的预测,内容上一个是垂直边缘,一个是橙色,是完全不同的,但是风格上是完全一致的

这两个来自什么呢,回忆一下,来自不同输出通道

然后这里就涉及了相关系数的概念,相关性弱,则趋近0,相关性强则数值比较大

那么对一个图不同通道间计算相关系数,那么这个相关系数在内容上趋近0,体现的便是风格值

对一个图,在第 l 层上的激活值,我们可以定义一个风格矩阵,记作 ,维度 ,由于是 gram-matrix 图矩阵,我们定义成了 G,但注意和 Generated image 的 G 区分,这俩不是一个 G

这个风格矩阵表示的是,所有通道两两组合得到的所有风格值,即  表示的是激活矩阵在第 和  通道间的相关系数

风格图像 S 在第 l 层得到的风格矩阵记作 

生成图像 G 在第 l 层得到的风格矩阵记作 

相关系数可能有许多计算方式,2015论文的原作者的计算方式如下所示

上面两个公式就是计算 S、G 的风格矩阵的公式

得到 S 和 G 的风格矩阵后,于是就可以把二者间的相似度作为代价函数,即计算二者差值后的第二范数,或者对矩阵而言应该叫佛罗贝尼乌斯范数比较规范,详见第二个课程的 1.4

上图所示的就是第 l 层的代价函数,或者说损失函数,原作者使用的时候给出了归一化系数

然后代价函数就是简单的求和啦,关键还有一个问题是低级特征和高级特征哪个对你更有用,所以这时候就可以对每层设一个权重超参数,来调节重要性,如下所示

4.11 一维到三维推广

如图所示对这种一维的序列模型,我们依然可以卷积,只不过少了一维罢了

比如图中的心电图,14 x 1,通道数为 1,我们可以用一维的卷积核,比如 5

然后卷出来就是 10 x 1,通道数为 1

当然你也可以用多个卷积核,比如 16 个卷积核,那就卷出来是 10 x 16,通道数为 16

对于序列模型,下个课程会讲,主要用 RNN、LCM 等模型,但是依然会有人尝试 CNN

如图所示,3D图像数据,比方说 CT 图像等等

三维卷积主要用于对各个切片特征的检测,可以检测动作及人物行为

计算方式还是那个样子,如下图所示

吴恩达深度学习之四《卷积神经网络》学习笔记相关推荐

  1. 吴恩达机器学习练习4:神经网络学习(损失函数和正则化)

    BP神经网络其信号是前向传播的,而在其计算其误差时是反向传播的. 本练习小节是执行反向传播算法并且将其应用到手写数字的识别当中. 1.神经网路 在前面的训练中,可以根据提供了权重值来预测手写数字.在本 ...

  2. 吴恩达deeplearning之CNN—卷积神经网络入门

    1.边界检测示例 假如你有一张如下的图像,你想让计算机搞清楚图像上有什么物体,你可以做的事情是检测图像的垂直边缘和水平边缘. 如下是一个6*6的灰度图像,构造一个3*3的矩阵,在卷积神经网络中通常称之 ...

  3. 2.5-2.7 1×1 卷积 Inception 吴恩达 第四门课 卷积神经网络 第二周 深度卷积网络

    2.5 网络中的网络以及 1×1 卷积(Network in Network and 1×1 convolutions 其中一个比较有帮助的想法是使用 1×1 卷积.过滤器为 1×1,这里是数字 2, ...

  4. 吴恩达作业9:卷积神经网络实现手势数字的识别(基于tensorflow)

    数据集链接:https://download.csdn.net/download/fanzonghao/10551018 提供数据集代码放在cnn_utils.py里. import math imp ...

  5. 吴恩达机器学习练习4:神经网络学习(反向传播)

    在本小节,将使用反向传播算法来计算神经网络损失函数的梯度. 1.S型函数梯度 由前几节可知,sigmoid函数为: 通过对S型函数求导,得到sigmoid的梯度为: 则可以得到sigmoidGradi ...

  6. 花书+吴恩达深度学习(十四)卷积神经网络 CNN 之经典案例(LetNet-5, AlexNet, VGG-16, ResNet, Inception Network)

    目录 0. 前言 1. LeNet-5 2. AlexNet 3. VGG-16 4. ResNet 残差网络 5. Inception Network 如果这篇文章对你有一点小小的帮助,请给个关注, ...

  7. 花书+吴恩达深度学习(十三)卷积神经网络 CNN 之运算过程(前向传播、反向传播)

    目录 0. 前言 1. 单层卷积网络 2. 各参数维度 3. CNN 前向传播反向传播 如果这篇文章对你有一点小小的帮助,请给个关注,点个赞喔~我会非常开心的~ 花书+吴恩达深度学习(十)卷积神经网络 ...

  8. 花书+吴恩达深度学习(十二)卷积神经网络 CNN 之全连接层

    目录 0. 前言 1. 全连接层(fully connected layer) 如果这篇文章对你有一点小小的帮助,请给个关注,点个赞喔~我会非常开心的~ 花书+吴恩达深度学习(十)卷积神经网络 CNN ...

  9. 花书+吴恩达深度学习(十一)卷积神经网络 CNN 之池化层

    目录 0. 前言 1. 最大池化(max pooling) 2. 平移不变形 3. 其他池化函数 4. 卷积和池化作为一种无限强的先验 如果这篇文章对你有一点小小的帮助,请给个关注,点个赞喔~我会非常 ...

  10. 花书+吴恩达深度学习(十)卷积神经网络 CNN 之卷积层

    目录 0. 前言 1. 2D 图像卷积 2. 3D 图像卷积 3. 过滤器(核函数) 4. 过滤器应用于边缘检测 5. padding 填充 6. stride 步长 7. 使用卷积的动机 8. 1乘 ...

最新文章

  1. Android多线程死锁定位,Java---多线程之死锁
  2. 高级指令——hostname指令【作用:操作服务器的主机名(读取、设置)】、id指令【查看一个用户的一些基本信息(包含用户id,用户组id,附加组id…)】、whoami指令、ps -ef指令
  3. 计算机视觉和图像分类,图像分类 - 计算机视觉 - Azure Cognitive Services | Microsoft Docs...
  4. python dataframe取列名_python – 获取列名在DataFrame中按其值排序
  5. Flink – window operator
  6. 基于 Spring Security 的开源统一角色访问控制系统 URACS
  7. hashCode和identityHashCode的区别你知道吗?
  8. echarts自学笔记
  9. 云+X案例展 | 传播类:南方报业数据中台建设,助力“智媒”飞跃发展
  10. form表单 1128
  11. 【华为云技术分享】华为专家亲述:如何转型搞 AI?
  12. Description Resource Path Location Type Project configuration is not up-to-date with pom.xml. Select
  13. Rabbitmq的原生javaAPI讲解
  14. 想转行数据分析,看完这篇再做决定
  15. HttpClient4文件上传
  16. Android开源框架Universal-Image-Loader完全解析(三)
  17. 交换机和路由器的区别
  18. 用观察者模式设计一个气象台
  19. 工作之余如何高效学习
  20. 《计算机网络 第7版》第9章 无线局域网的物理层和MAC层

热门文章

  1. Python_爬虫_BeautifulSoup网页解析库
  2. 每日关键词-170304-.net,c#分层架构常识
  3. 深入理解数组与指针——原因在于”退化“
  4. (转)一步一步Asp.Net MVC系列_权限管理之权限控制
  5. 正式发布 .Net2.0 大文件上传服务器控件
  6. java递归简易应用教程
  7. preventDefault() 方法 取消事件的默认动作
  8. Wikioi 2822爱在心中(强连通缩点+dfs)
  9. maven 创建project
  10. 【数据泵】EXPDP导出表结构