2.9 迁移学习(Transfer Learning)
如果你要做一个计算机视觉的应用,相比于从头训练权重,或者说从随机初始化权重开始,如果你下载别人已经训练好网络结构的权重,你通常能够进展的相当快,用这个作为预训练,然后转换到你感兴趣的任务上。
另一个技巧,也许对一些情况有用,由于前面的层都冻结了,相当于一个固定的函数。因为你不需要改变它,也不训练它,取输入图像𝑌,然后把它映射到这层(softmax的前一层)的激活函数。所以这个能加速训练的技巧就是,如果我们先计算这一层(紫色箭头标记),计算特征或者激活值,然后把它们存到硬盘里。你所做的就是用这个固定的函数,在这个神经网络的前半部分(softmax 层之前的所有层视为一个固定映射),取任意输入图像𝑌,然后计算它的某个特征向量,这样你训练的就是一个很浅的 softmax 模型,用这个特征向量来做预测。对你的计算有用的一步就是对你的训练集中所有样本的这一层的激活值进行预计算,然后存储到硬盘里,然后在此之上训练 softmax 分类器。
所以,存储到硬盘或者说预计算方法的优点就是,你不需要每次遍历训练集再重新计算这个激活值了。
可以用下载的权重只作为初始化,用它们来代替随机初始化,接着你可以用梯度下降训练,更新网络所有层的所有权重。
2.10 数据扩充(Data augmentation)
大部分的计算机视觉任务使用很多的数据,所以数据扩充是经常使用的一种技巧来提高计算机视觉系统的表现。我认为计算机视觉是一个相当复杂的工作,你需要输入图像的像素值,然后弄清楚图片中有什么,似乎你需要学习一个复杂方程来做这件事。在实践中,更多的数据对大多数计算机视觉任务都有所帮助,不像其他领域,有时候得到充足的数据,但是效果并不怎么样。但是,当下在计算机视觉方面,计算机视觉的主要问题是没有办法得到充足的数据。对大多数机器学习应用,这不是问题,但是对计算机视觉,数据就远远不够。
所以这就意味着当你训练计算机视觉模型的时候,数据扩充会有所帮助,这是可行的,无论你是使用迁移学习,使用别人的预训练模型开始,或者从源代码开始训练模型。让我们来看一下计算机视觉中常见的数据扩充的方法。
或许最简单的数据扩充方法就是垂直镜像对称,假如,训练集中有这张图片,然后将其翻转得到右边的图像。对大多数计算机视觉任务,左边的图片是猫,然后镜像对称仍然是猫,如果镜像操作保留了图像中想识别的物体的前提下,这是个很实用的数据扩充技巧。
另一个经常使用的技巧是随机裁剪,给定一个数据集,然后开始随机裁剪,可能修剪这个(编号 1),选择裁剪这个(编号 2),这个(编号 3),可以得到不同的图片放在数据集中,你的训练集中有不同的裁剪。随机裁剪并不是一个完美的数据扩充的方法,如果你随机裁剪的那一部分(红色方框标记部分,编号 4),哪一个看起来更像猫。但在实践中,这个方法还是很实用的,随机裁剪构成了很大一部分的真实图片。
镜像对称和随机裁剪是经常被使用的。当然,理论上,你也可以使用旋转,剪切(shearing:此处并非裁剪的含义,图像仅水平或垂直坐标发生变化)图像,可以对图像进行这样的扭曲变形,引入很多形式的局部弯曲等等。当然使用这些方法并没有坏处,尽管在实践中,因为太复杂了所以使用的很少。
第二种经常使用的方法是彩色转换,有这样一张图片,然后给 R、G 和 B 三个通道上加上不同的失真值。
在这个例子中(编号 1),要给红色、蓝色通道加值,给绿色通道减值。红色和蓝色会产生紫色,使整张图片看起来偏紫,这样训练集中就有失真的图片。为了演示效果,我对图片的颜色进行改变比较夸张。在实践中,对 R、G 和 B 的变化是基于某些分布的,这样的改变也可能很小。
这么做的目的就是使用不同的 R、G 和 B 的值,使用这些值来改变颜色。在第二个例子中(编号 2),我们少用了一点红色,更多的绿色和蓝色色调,这就使得图片偏黄一点。在这(编号 3)使用了更多的蓝色,仅仅多了点红色。在实践中,R、G 和 B 的值是根据某种概率分布来决定的。这么做的理由是,可能阳光会有一点偏黄,或者是灯光照明有一点偏黄,这些可以轻易的改变图像的颜色,但是对猫的识别,或者是内容的识别,以及标签𝑧,还是保持不变的。所以介绍这些,颜色失真或者是颜色变换方法,这样会使得你的学习算法对照片的颜色更改更具鲁棒性。
这是对更高级的学习者的一些注意提醒,你可以不理解我用红色标出来的内容。对 R、G 和 B 有不同的采样方式,其中一种影响颜色失真的算法是 PCA,即 主成分分析。但具体颜色改变的细节在 AlexNet 的论文中有时候被称作 PCA 颜色增强,PCA 颜色增强的大概含义是,比如说,如果你的图片呈现紫色,即主要含有红色和蓝色,绿色很少,然后 PCA 颜色增强算法就会对红色和蓝色增减很多,绿色变化相对少一点,所以使总体的颜色保持一致。
这就是数据扩充,与训练深度神经网络的其他部分类似,在数据扩充过程中也有一些超参数,比如说颜色变化了多少,以及随机裁剪的时候使用的参数。与计算机视觉其他部分类似,一个好的开始可能是使用别人的开源实现,了解他们如何实现数据扩充。当然如果你想获得更多的不变特性,而其他人的开源实现并没有实现这个,你也可以去调整这些参数。因此,我希望你们可以使用数据扩充使你的计算机视觉应用效果更好
2.11 计算机视觉现状(The state of computer vision)
图像识别其实是如何看图片的问题,并且告诉你这张图是不是猫,而对象检测则是看一幅图,你画一个框,告诉你图片里的物体,比如汽车等等。因为获取边框的成本比标记对象的成本更高,所以我们进行对象检测的数据往往比图像识别数据要少。
所以当我看机器学习应用时,我们认为通常我们的学习算法有两种知识来源。
一个来源是被标记的数据,就像(𝑦 , 𝑧)应用在监督学习。
第二个知识来源是手工工程,有很多方法去建立一个手工工程系统,它可以是源于精心设计的特征,手工精心设计的网络体系结构或者是系统的其他组件。所以当你没有太多标签数据时,你只需要更多地考虑手工工程。
所以我认为计算机视觉是在试图学习一个非常复杂的功能,我们经常感觉我们没有足够的数据,即使获得了更多数据,我们还是经常觉得还是没有足够的数据来满足需求。这就是为什么计算机视觉,从过去甚至到现在都更多地依赖于手工工程。我认为这也是计算机视觉领域发展相当复杂网络架构地原因,因为在缺乏更多数据的情况下,获得良好表现的方式还是花更多时间进行架构设计,或者说在网络架构设计上浪费(贬义褒用,即需要花费更多时间的意思)更多时间。
下面是一些有助于在基准测试中表现出色的小技巧。
其中一个是集成,这就意味着在你想好了你想要的神经网络之后,可以独立训练几个神经网络,并平均它们的输出。比如说随机初始化三个、五个或者七个神经网络,然后训练所有这些网络,然后平均它们的输出。另外对他们的输出 ŷ 进行平均计算是很重要的,不要平均他们的权重,这是行不通的。看看你的 7 个神经网络,它们有 7 个不同的预测,然后平均他们,这可能会让你在基准上提高 1%,2%或者更好。这会让你做得更好,也许有时会达到1%或 2%,这真的能帮助你赢得比赛。但因为集成意味着要对每张图片进行测试,你可能需要在从 3 到 15 个不同的网络中运行一个图像,这是很典型的,因为这 3 到 15 个网络可能会让你的运行时间变慢,甚至更多时间,所以技巧之一的集成是人们在基准测试中表现出色和赢得比赛的利器,但我认为这几乎不用于生产服务于客户的,我想除非你有一个巨大的计算预算而且不介意在每个用户图像数据上花费大量的计算。
你在论文中可以看到在测试时,对进准测试有帮助的另一个技巧就是 Multi-crop at testtime,我的意思是你已经看到了如何进行数据扩充,Multi-crop 是一种将数据扩充应用到你的测试图像中的一种形式。
举个例子,让我们看看猫的图片,然后把它复制四遍,包括它的两个镜像版本。有一种叫作 10-crop 的技术(crop 理解为裁剪的意思),它基本上说,假设你取这个中心区域,裁剪,然后通过你的分类器去运行它,然后取左上角区域,运行你的分类器,右上角用绿色表示,左下方用黄色表示,右下方用橙色表示,通过你的分类器来运行它,然后对镜像图像做同样的事情对吧?所以取中心的 crop,然后取四个角落的 crop。
这是这里(编号 1)和这里(编号 3)就是中心 crop,这里(编号 2)和这里(编号 4)是四个角落的 crop。如果把这些加起来,就会有 10 种不同的图像的 crop,因此命名为 10-crop。所以你要做的就是,通过你的分类器来运行这十张图片,然后对结果进行平均。如果你有足够的计算预算,你可以这么做,也许他们需要 10 个 crops,你可以使用更多,这可能会让你在生产系统中获得更好的性能。如果是生产的话,我的意思还是实际部署用户的系统。
但这是另一种技术,它在基准测试上的应用,要比实际生产系统中好得多。
集成的一个大问题是你需要保持所有这些不同的神经网络,这就占用了更多的计算机内存。对于 multi-crop,我想你只保留一个网络,所以它不会占用太多的内存,但它仍然会让你的运行时间变慢。