干货|多重预训练视觉模型的迁移学习

作者: 佚名 2017-12-26 13:53:31

本文介绍的是基于Keras Tensorflow抽象库建立的迁移学习算法模型,算法简单、易于实现,并且具有很好的效果。

许多被称为“深度学习”的方法已经出现在机器学习和数据科学领域。在所有的这些“深度学习”方法中,有一种尤为突出,即对已学习representations的迁移,其有一种方法在迁移已学习的representations时,其简洁性、鲁棒性、有效性尤为突出。尤其是在计算机视觉领域,这个方法展示出了***的优势,使以前难以克服的任务变得像keras.applications import *一样容易。

简而言之,这个方法规定应该使用一个大型的数据集学习将所感兴趣的对象(如图像,时间序列,客户,甚至是网络)表示为一个特征向量,以适合数据科学研究任务,如分类或聚类。一旦学习完毕,representation机制就可供其他研究人员或其他数据集使用, 而几乎不需要考虑新数据的数据量或可用计算资源的大小。

本文我们展示了基于预训练计算机视觉模型的迁移学习的用途,并使用了keras TensorFlow抽象库。预训练计算机视觉模型已经在大型ImageNet数据集上进行了训练,并学会了以特征向量的形式生成图像的简单表示。这里,我们将利用这个机制学习一个鸟类分类器。

能够使用预训练模型的方法有很多,其选择通常取决于数据集的大小和可用的计算资源,这些方法包括:

  1. 微调(Fine tuning):在这种情况下,用适当大小的softmax层替换网络的最终分类层,以适应当前的数据集,同时其他所有层的学习参数保持不变,然后在新任务上进行更进一步的训练。
  2. 冻结(Freezing):fine-turning方法需要相对较强的计算能力和较大的数据量。对于较小的数据集,通常“冻结”网络的一些***层,这就意味着预训练网络的参数在这些层中是固定的。其他层在新任务上像以前一样进行训练。
  3. 特征提取(Feature extraction):这种方法是预训练网络最宽松的一种用法。图像经过网络前馈,将一个特定的层(通常是在最终分类器输出之前的一个层)作为一个representation,其对新任务绝对不会再训练。这种图像-矢量机制的输出,在后续任何任务中几乎都可以使用。

本文我们将使用特征提取方法。首先,我们使用单个预训练深度学习模型,然后使用堆叠技术将四个不同的模型组合在一起。然后再对CUB-200数据集进行分类,这个数据集(由vision.caltech提供)包括200种被选中的鸟类图像。

首先,下载数据集,MAC/Linux系统下载路径:

或者,只需手动下载并解压文件即可。

接下来将描述程序中的主要元素。我们省略了导入和部署代码,以支持可读性更好的文本,如有需要请查看完整代码。

让我们从加载数据集开始,用一个效用函数(here)来加载具有指定大小的图像的数据集。当解压数据集时创建了“CUB_200_2011”文件夹,常量CUB_DIR指向该文件夹中的“image”目录。

首先,我们将用Resnet50模型(参见论文和keras文件)进行特征提取。注意,我们所使用的是大小为244X244像素的图像。为了生成整个数据集的向量representations,需要添加以下两行代码:

当模型被创建时,使用preprocess_input函数对初始训练数据(ImageNet)进行规范化,即求出平均信道像素值的减法结果。ResNet50.predict进行实际转换,返回代表每个图像大小为2048的向量。当***被调用时,ResNet501d[1]的构造器会下载预训练的参数文件,所需时间长短取决于您的网速。之后,用这些特征向量和简单的线性SVM分类器来进行交叉验证过程。

[ 0.62522158 0.62344583 0.62852745]

Overall accuracy: 62.6

通过这个简单的方法,我们在200类数据集上达到了62.6%的准确度。在接下来的部分中,我们将使用几个预先训练好的模型和一个叠加方法来继续改进这个结果。

使用多个预训练模型后,感觉与任何情况下使用一个特征集的情况相同:它们希望提供一些不重叠的信息,从而使组合时性能更优越。

我们将使用的方法来自这四个预训练模型(VGG19, ResNet, Inception, and Xception)派生出的特性,被统称为“stacking”。Stacking是一个两阶段的算法,在此算法中,一组模型(基础分类器)的预测结果被聚合并传送到第二阶段的预测器中(元分类器)。在这个例子中,每个基本分类器将是一个简单的逻辑回归模型。然后求出这些输出概率的平均数,并传送到一个线性SVM算法中来提供最终决策。

每个预训练的模型(如上述的ResNet)都可以生成特征集(X_vgg, X_resnet, X_incept, X_xcept),我们以此作为开始(完整的代码请参阅git repo)。方便起见,将所有的特征集合叠加到一个单独的矩阵中,但是保留边界索引,以便每个模型都可以指向正确的集合。

我们将使用功能强大的mlxtend扩展库,使stacking算法变得更加容易。对于四个基本分类器中的任何一个,我们都构建了一个可以选择适当特性的传递方法,并遵循LogisticRegression算法的途径。

定义并配置堆叠分类器,以使用每个基本分类器提供的平均概率作为聚合函数。

***,我们准备测试stacking方法:

[ 0.74221322 0.74194367 0.75115444]

Overall accuracy: 74.5

提供一些基于模型的分类器,并利用这些单独的被预先训练过的分类器的stacking方法,我们获得了74.5%的精确度,与单一的ResNet模型相比有了很大的提升(人们可以用同样的方法测试其它模型,来对两种方法进行比较)。

综上所述,本文描述了利用多个预训练模型作为特征提取机制的方法,以及使用stacking算法将它们结合起来用于图像分类的方法。这种方法简单,易于实现,而且几乎会产生出人意料的好结果。

[1]深度学习模型通常是在GPU上训练,如果您使用的是低端笔记本GPU,可能不适合运行我们这里使用的一些模型,因为会导致内存溢出异常,如果是这样,那么您应该强制TensorFlow运行CPU上的所有内容,将所有深度学习相关的内容放到一个带有tf.device("/cpu:0"): 的块下面。

深度学习 迁移学习
上一篇:深度学习,如何用去噪自编码器预测原始数据? 下一篇:中国人工智能3大优势,5年后将会赶超日美两国!
评论
取消
暂无评论,快去成为第一个评论的人吧

更多资讯推荐

体验中国自主知识产权天元深度学习引擎与TensorFlow,PyTorch的对比

深度学习驱动之下最早创业的中国AI独角兽旷视,宣布开源自研深度学习框架MegEngine(Brain++核心组件之一),中文名天元——取自围棋棋盘中心点的名称。

尹成 ·  3天前
2020年深度学习优秀GPU一览,看看哪一款最适合你!

如果你准备进入深度学习,什么样的GPU才是最合适的呢?下面列出了一些适合进行深度学习模型训练的GPU,并将它们进行了横向比较,一起来看看吧!

大数据文摘 ·  4天前
清华开源Jittor:首个国内高校自研深度学习框架,一键转换PyTorch

深度学习框架越来越多,主导的团队也从高校研究机构渐渐转向了科技巨头。但是,学界在这一领域的力量不容忽视。今日。清华大学开发了一个名为计图(Jittor)的深度学习框架。

佚名 ·  2020-03-20 14:33:29
一行代码让性能提升2倍 精选

如果现在向你推荐一款神器,可以实现训练速度翻倍,访存效率翻倍,你心动吗?心动不如行动,来和我一起看看这款神器——基于PaddlePaddle核心框架的自动混合精度技术,简称飞桨 AMP 技术。

佚名 ·  2020-03-13 13:23:42
Facebook研究开放三个新框架,让深度学习更容易

你知道吗?微软、谷歌、Facebook、亚马逊、Uber等科技巨头的研究部门已经成为人工智能(AI)领域开源框架最活跃的贡献者之一。

读芯术 ·  2020-03-10 13:27:28
迁移学习,让深度学习不再困难……

在不远的过去,数据科学团队需要一些东西来有效地利用深度学习:新颖的模型架构,很可能是内部设计的;访问大型且可能是专有的数据集;大规模模型训练所需的硬件或资金。

读芯术 ·  2020-03-02 17:03:32
国产深度学习框架MegEngine,三月底即将开源

2020 年我们应该选择哪一种深度学习框架?现在又有了一个新选择,据可靠消息,来自旷视 Brain++的 核心深度学习框架即将于 3 月底开源。

Synced ·  2020-02-28 15:20:38
从TensorFlow到Theano:横向对比七大深度学习框架

最近,来自数据科学公司 Silicon Valley Data Science 的数据工程师 Matt Rubashkin(UC Berkeley 博士)为我们带来了深度学习 7 种流行框架的深度横向对比,希望本文能对你带来帮助。

AI小师弟 ·  2020-02-25 15:04:48
Copyright©2005-2020 51CTO.COM 版权所有 未经许可 请勿转载