jiashi(带你了解一波)
点击上方关注,All in AI中国
介绍
人类具有跨任务传递知识的固有能力。我们在学习一项任务时获得的知识,会以同样的方式利用来解决相关任务。任务越相关,我们就越容易迁移或交叉利用我们的知识。一些简单的例子是,
知道如何骑摩托车⮫学习如何骑车知道如何演奏经典钢琴⮫学习如何演奏爵士钢琴了解数学和统计学⮫学习机器学习在上述每种情况中,当我们尝试学习新的方面或主题时,我们不会从头开始学习所有内容。我们会从过去学到的知识中迁移和利用我们的知识!
到目前为止,传统的机器学习和深度学习算法传统上被设计为孤立地工作。训练这些算法以解决特定任务。一旦特征空间分布发生变化,就必须从头开始重建模型。迁移学习是克服孤立学习范式,并利用为一项任务获得的知识来解决相关问题的想法。在本文中,我们将全面介绍迁移学习的概念、范围和实际应用,甚至展示一些动手实例。更具体地说,我们将涵盖以下内容。
迁移学习的动机了解迁移学习迁移学习策略为深度学习服务的迁移学习深度迁移学习策略深度迁移学习的类型迁移学习的应用案例研究1:具有数据可用性约束的图像分类案例研究2:具有大量类和更少数据可用性的多类细粒度图像分类迁移学习优势迁移学习挑战结论和未来范围我们将迁移学习看作是从机器学习和统计建模时代开始的一般高级概念,然而,在本文中,我们将更加关注本文中的深度学习。
注意:所有案例研究都将包含有关代码和输出的逐步详细信息。这里描述的案例研究及其结果纯粹基于我们在编写本书时实施和测试这些模型时所进行的实际实验:使用Python进行迁移学习(详见本文末尾)。
本文旨在尝试涵盖理论概念,并在一个地方展示深度学习应用的实际动手实例,因为网络上往往信息过载。 Python中将使用带有tensorflow后端的keras来覆盖所有示例,这对于“退伍军人”或刚刚开始深度学习的人来说是完美的匹配!
迁移学习的动机
我们已经简要地讨论过,人类不会从头开始学习所有内容,并将他们的知识从先前学习的领域转移到新的领域和任务。考虑到推动真人工智能的热潮,数据科学家和研究人员认为迁移学习可以促进我们在AGI方面的进步。事实上,与Google Brain、百度、斯坦福和Coursera有联系的著名教授兼数据科学家吴恩达最近在NIPS 2016上做了一个惊人的教程,名为“使用深度学习构建AI应用程序的具体细节”。
在有监督的学习之后 - 迁移学习将成为ML成功的下一个推动力
我推荐感兴趣的人来看看NIPS 2016的有趣教程。
事实上,迁移学习并不是一个在2010年出现的概念。神经信息处理系统(NIPS)1995研讨会学会学习:归纳系统中的知识整合和转移被认为是该领域研究的最初动机。从那时起,学会学习、知识整合和归纳迁移等术语与转学习可以互换使用。不同的研究人员和学术文本总是提供不同背景下的定义。在著名的书“深度学习”、Goodfellow等人。指泛化背景下的迁移学习。他们的定义如下:
利用在一个环境中学到的东西来改善另一个环境中的泛化的情况。
因此,关键的动机,特别是考虑到深度学习的背景,大多数解决复杂问题的模型需要大量的数据,并且考虑到时间和效果,为监督模型获取大量标记数据真的很困难。
了解迁移学习
这里要记住的第一件事是,迁移学习并不是一个非常特定于深度学习的新概念。建立和训练机器学习模型的传统方法与遵循迁移学习原则的方法之间存在明显差异。
传统学习是孤立的,纯粹基于特定任务,数据集和训练单独的孤立模型。不保留任何可以从一种模型迁移到另一种模型的知识。在迁移学习中,您可以利用以前训练过的模型中的知识(特征,权重等)来训练新模型,甚至可以解决诸如为较新任务提供较少数据的问题!
让我们借助一个例子来理解前面的解释。假设我们的任务是识别餐馆受限域内图像中的对象。让我们在定义的范围内将此任务标记为T1。给定此任务的数据集,我们训练模型并对其进行调整,以便对来自同一域(餐厅)的未见数据点执行良好(概括)。当我们没有足够的训练样例来处理给定域中的所需任务时,传统的监督ML算法就会崩溃。假设我们现在必须从公园或咖啡馆中的图像中检测对象(例如,任务T2)。理想情况下,我们应该能够应用针对T1训练的模型,但实际上性能下降也不能很好地推广的模型。出现这种情况的原因有多种,我们可以称之为模型对训练数据和领域的偏见。
迁移学习应该使我们能够利用以前学到的任务中的知识,并将其应用到新的相关任务中。如果任务T1的数据显著增加,我们可以利用任务T1的学习,并将此知识(特性、权重)推广到任务T2(数据显著减少)。在计算机视觉领域出现问题的情况下,某些低级特征(如边缘,形状,角落和强度)可以跨任务共享,从而实现任务之间的知识迁移!正如我们在前面的图中所描述的那样,来自现有任务的知识在学习新的目标任务时充当额外的输入。
正式定义
现在让我们看一下迁移学习的正式定义,然后利用它来理解不同的策略。在他们的论文“迁移学习调查”中,Pan和Yang使用域、任务和边际概率来提供理解迁移学习的框架。框架定义如下:
域D被定义为由元素空间ꭕ和边际概率P(Χ)组成的双元素元组,其中X是样本数据点。因此,我们可以在数学上将域表示为D = {ꭕ,P(Χ)}
这里xᵢ表示如上述描述中所表示的特定向量。另一方面,任务T可以被定义为标签空间的两元素元组γ和目标函数η。目标函数也可以从概率视角表示为P(γ| X)。
因此,有了这些定义和表述,我们可以通过塞巴斯蒂安·鲁德的优秀文章来定义迁移学习如下。
方案
现在让我们看看基于我们之前定义的涉及迁移学习的典型场景。
为了更清楚地说明术语域和任务之间的区别,下图试图用一些例子来解释它们。
关键要点
正如我们目前所见,迁移学习能够利用源学习者在目标任务中的现有知识。在迁移学习过程中,必须回答以下三个重要问题:
迁移什么:这是整个过程中第一步也是最重要的一步。我们试图寻找关于哪些部分知识可以从源传递到目标的答案,以便提高目标任务的性能。在尝试回答这个问题时,我们会尝试确定哪些部分的知识是特定于源的以及源和目标之间的共同点。何时迁移:可能存在这样的情况:为了它而迁移知识可能比改善任何事情更糟糕(也称为负迁移)。我们应该致力于利用迁移学习来改善目标任务绩效/结果,而不是降低它们。我们需要注意何时迁移以及何时不迁移。如何迁移:一旦回答了什么和何时,我们就可以着手确定跨域/任务实际迁移知识的方法。这涉及对现有算法和不同技术的更改,我们将在本文后面的部分中介绍。此外,最后还列出了具体的案例研究,以便更好地理解如何迁移。这应该有助于我们定义可以应用迁移学习的各种场景以及可能的技术,我们将在下一节中讨论。
迁移学习策略
有不同的迁移学习策略和技术可以基于域、任务和数据的可用性来应用。
因此,基于前面的图,可以基于所涉及的传统ML算法的类型对迁移学习方法进行分类,例如:
归纳迁移学习:在这种情况下,源域和目标域是相同的,但源和目标任务彼此不同。算法尝试利用源域的归纳偏差来帮助改进目标任务。根据源域是否包含标记数据,这可以进一步分为两个子类别,分别类似于多任务学习和自学习。无监督迁移学习:此设置类似于归纳迁移本身,重点关注目标域中的无监督任务。源域和目标域类似,但任务不同。在这种情况下,标记的数据在任一域中都不可用。迁移学习:在这种情况下,源任务和目标任务之间存在相似之处,但相应的域不同。在此设置中,源域具有大量标记数据,而目标域没有。这可以进一步分类为子类别,指的是特征空间不同或边际概率的设置。我们可以总结下表中每种技术的不同设置和方案。
上一节中讨论的三种迁移类别概述了可以应用和研究迁移学习的不同设置。要回答跨这些类别迁移的问题,可以应用以下一些方法:
实例迁移:将源域中的知识重用到目标任务通常是一种理想的方案。在大多数情况下,源域数据不能直接重用。相反,源域中的某些实例可以与目标数据一起重用以改善结果。在归纳迁移的情况下,诸如Dai的AdaBoost和他们的共同作者的修改有助于利用来自源域的训练实例来改进目标任务。特征表示迁移:该方法旨在通过识别可以从源域到目标域使用的良好特征表示来最小化域差异并降低错误率。根据标记数据的可用性,可以对基于特征表示的传输应用监督或非监督方法。参数传递:该方法基于相关任务的模型共享一些参数或超参数的先前分布的假设。与多任务学习(其中源和目标任务同时学习)不同,对于迁移学习,我们可以对目标域的丢失应用额外的权重以提高整体性能。关系知识迁移:与前面三种方法不同,关系知识迁移试图处理非IID数据,例如非独立且相同分布的数据。换句话说,每个数据点与其他数据点有关系的数据;例如,社交网络数据利用关系知识迁移技术。下表清楚地总结了不同迁移学习策略与迁移学习内容之间的关系。
现在让我们利用这种理解,学习如何在深度学习的背景下应用迁移学习。
为深度学习而服务的迁移学习
我们在上一节中讨论的策略是可以应用于机器学习技术的一般方法,它将我们带到了问题,迁移学习真的可以应用于深度学习的背景吗?
深度学习模型代表了所谓的归纳学习。归纳学习算法的目标是从一组训练样例中推断出映射。例如,在分类的情况下,模型学习输入要素和类标签之间的映射。为了使这样的学习者很好地概括看不见的数据,其算法采用了一组与训练数据分布相关的假设。这些假设被称为归纳偏差,归纳偏差或假设可以通过多种因素来表征,例如它限制的假设空间和通过假设空间的搜索过程。因此,这些偏差会影响模型在给定任务和领域中学习的方式和内容。
归纳传递技术利用源任务的归纳偏差来辅助目标任务。这可以通过不同方式完成,例如通过限制模型空间来调整目标任务的归纳偏差,缩小假设空间,或者借助源任务的知识对搜索过程本身进行调整。在下图中可视地描绘该过程。
除了归纳迁移之外,归纳学习算法还利用贝叶斯和分层传递技术来帮助改进目标任务的学习和性能。
深度迁移学习策略
深度学习近年来取得了长足的进步,根据我们可以解决的复杂问题的类型,取得的成果令人惊讶。然而,这种深度学习系统所需的训练时间和数据量的数量级比传统的ML系统大得多。有各种深度学习网络,具有最先进的性能(有时甚至优于人类表现),已经在计算机视觉和自然语言处理(NLP)等领域开发和测试。在大多数情况下,团队/人员共享这些网络的详细信息供其他人使用。这些预训练的网络/模型构成了深度学习环境中迁移学习的基础,或者我称之为“深度迁移学习”的基础。让我们来看看两种最受欢迎的深度迁移学习策略。
现成的预训练模型作为特征提取器
深度学习系统和模型是分层体系结构,可以学习不同层的不同特征(分层特征的层次表示)。然后,这些层最终连接到最后一层(在分类的情况下通常是完全连接的层)以获得最终输出。这种分层架构允许我们利用预先训练的网络(例如Inception V3或VGG)而不将其最终层作为其他任务的固定特征提取器。
这里的关键思想是仅利用预训练模型的加权层来提取特征,而不是在训练期间使用新任务的新数据更新模型层的权重。
例如,如果我们利用AlexNet而不使用其最终分类层,它将帮助我们根据其隐藏状态将图像从新域任务转换为4096维向量,从而使我们能够从新域任务中提取特征,利用来自源域任务的知识。这是使用深度神经网络进行迁移学习的最广泛的使用方法之一。
现在可能会出现一个问题,这些预先训练好的现成功能在不同任务的实践中是如何运作的?
它似乎在现实世界的任务中运行得非常好,如果上表中的图表不是很清楚,下图应该使它们在不同的基于计算机视觉的任务中的表现更加清晰!
基于上图中的红色和粉红色条,您可以清楚地看到预训练模型的特征始终优于非常专业的以任务为中心的深度学习模型。
微调现成的预训练模型
这是一种更为复杂的技术,我们不仅仅替换最后一层(用于分类/回归),而且我们还有选择地重新训练一些先前的层。深度神经网络是具有各种超参数的高度可配置架构。如前所述,初始层已被视为捕获通用功能,而后者则更多地关注手头的特定任务。下图中描述了一个关于人脸识别问题的示例,其中网络的初始较低层学习非常通用的特征,而较高层学习非常特定于任务的特征。
利用这种洞察力,我们可以在重新训练时冻结(固定重量)某些层,或者对其余层进行微调以满足我们的需要。在这种情况下,我们利用网络整体架构方面的知识,并以其状态作为我们再训练步骤的起点。反过来,这有助于我们以更少的训练时间实现更好的性能。
冻结还是微调?
这就引出了一个问题,我们是否应该冻结网络中的图层以将它们用作特征提取器,还是应该在过程中微调图层?
这应该让我们对每种策略的具体内容以及何时使用它们有一个很好的认识!
预先训练的模型
迁移学习的基本要求之一是存在能够在源任务上表现良好的模型。幸运的是,深度学习世界相信分享。许多最先进的深度学习架构已由各自的团队公开分享。这些跨越不同的领域,例如计算机视觉和NLP,这两个最受欢迎的深度学习应用领域。预训练模型通常以模型实现的数百万参数/权重的形式共享,同时训练为稳定状态。预训练模型可供所有人通过不同方式使用。著名的深度学习Python库keras提供了一个下载一些流行模型的界面。您还可以从网络访问预先训练的模型,因为大多数模型都是开源的。
对于计算机视觉,您可以利用一些流行的模型,包括,
VGG-16VGG-19初始V3XCeptionRESNET-50对于自然语言处理任务,由于NLP任务的不同性质,事情变得更加困难。您可以利用单词嵌入模型,包括
Word2Vec手套FastText但等等,这不是全部!最近,NLP的迁移学习取得了一些很好的进步。最为显著地是,
Google的Universal Sentence Encoder来自变形金刚(BERT)的双向编码器表示它们肯定有很多承诺,我相信它们很快就会被广泛采用,用于实际应用。
深度迁移学习的类型
关于迁移学习的文献已经经历了很多次迭代,正如本章开头所提到的,与之相关的术语已被松散地使用并且经常互换。因此,区分迁移学习,领域适应和多任务学习有时会令人困惑。请放心,这些都是相关的,并尝试解决类似的问题。一般来说,您应该始终将迁移学习视为一般概念或原则,我们将尝试使用源任务领域知识来解决目标任务。
域适应
域自适应通常在源域和目标域之间的边际概率不同的情况下被引用,例如P(Xₛ)≠P(Xₜ)。源域和目标域的数据分布存在固有的迁移或漂移,需要调整才能迁移学习。例如,标记为正面或负面的电影评论的语料库将不同于产品评论情绪的语料库。如果用于对产品评论进行分类,则对电影评论情绪进行过训练的分类器将看到不同的分布。因此,域适应技术在这些场景中用于迁移学习。
域名混乱
我们学习了不同的迁移学习策略,甚至讨论了从源头到目标的知识、时间和方式的三个问题。特别是,我们讨论了特征表示迁移如何有用。值得重新思考的是,深度学习网络中的不同层捕获不同的特征集。我们可以利用这一事实来学习域不变特征并提高跨域的可迁移性。我们不是让模型学习任何表示,而是将两个域的表示尽可能地相似。这可以通过将某些预处理步骤直接应用于表示本身来实现。 Baochen Sun,Jiashi Feng和Kate Saenko在他们的论文“令人沮丧的简单领域适应的回归”中讨论了其中的一些问题。 Ganin等人也在《神经网络的领域对抗式训练》的论文中提到了这个问题。这种技术背后的基本思想是在源模型中添加另一个目标,通过混淆域本身来鼓励相似性,从而混淆域。
多任务学习
多任务学习是迁移学习世界略有不同的风格。在多任务学习的情况下,同时学习若干任务而不区分源和目标。在这种情况下,与迁移学习相比,学习者一次接收关于多个任务的信息,其中学习者最初不知道目标任务。这会在下图中描述。
一次性学习
深度学习系统本质上是饥饿的数据,因此他们需要许多训练样例来学习权重。这是深度神经网络的限制方面之一,尽管人类学习并非如此。例如,一旦孩子看到苹果的样子,他们就可以很容易地识别出不同种类的苹果(有一个或几个训练样例); ML和深度学习算法不是这种情况。一次性学习是迁移学习的一种变体,我们试图仅根据一个或几个训练样例来推断所需的输出。这在实际场景中基本上是有用的,在这些场景中,不可能为每个可能的类(如果它是分类任务)和在经常添加新类的场景中具有标记数据。《对象类别的一次性学习》这一具有里程碑意义的论文被认为是创造了一次性学习这个子领域的研究。本文提出了贝叶斯框架的变异,用于对象分类的表示学习。此后,该方法得到了改进,并使用深度学习系统进行了应用。
零样本学习
零样本学习是迁移学习的另一种极端变体,它依赖于没有标记的例子来学习任务。这可能听起来令人难以置信,尤其是当使用示例进行学习时,大多数监督学习算法都是如此。零数据学习或零样本学习方法在训练阶段进行巧妙调整,以利用其他信息来理解看不见的数据。在他们关于深度学习的书中,Goodfellow和他们的合著者将零样本学习呈现为学习三个变量的场景,例如传统的输入变量x,传统的输出变量y和描述的附加随机变量。因此,该模型被训练以学习P(y | x,T)的条件概率分布。零样本学习在机器翻译等场景中派上用场,我们甚至可能没有目标语言的标签。
迁移学习的应用
深度学习绝对是一种特定的算法类别,它已经被用来非常成功地获得转移学习的好处。以下是几个例子:
NLP的迁移学习:文本数据在ML和深度学习方面提出了各种各样的挑战。通常使用不同的技术对这些进行迁移或矢量化。使用不同的训练数据集准备了嵌入,例如Word2vec和FastText。通过从源任务传递知识,可以将它们用于不同的任务,例如情感分析和文档分类。除此之外,像Universal Sentence Encoder和BERT这样的新型号无疑为未来提供了无数的可能性。音频/语音转移学习:与NLP和计算机视觉等领域类似,深度学习已成功用于基于音频数据的任务。例如,为英语开发的自动语音识别(ASR)模型已成功用于提高其他语言(如德语)的语音识别性能。此外,自动扬声器识别是迁移学习派上很大用场的另一个例子。计算机视觉的迁移学习:深度学习已经成功地用于各种计算机视觉任务,例如使用不同CNN架构的对象识别和识别。在他们的论文中,Yosinski及其合著者(https://arxiv.org/abs/1411.1792)在深层神经网络中的特征是如何迁移的,他们的研究结果表明了下层如何充当传统的计算机视觉特征提取器,如作为边缘检测器,而最终层面朝向特定任务的功能。因此,这些发现有助于利用现有的最先进模型,如VGG,AlexNet和Inceptions,用于目标任务,例如样式迁移和面部检测,这些模型与最初训练的模型不同。让我们现在探索一些现实世界的案例研究,并建立一些深度迁移学习模型!
案例研究1:具有数据可用性约束的图像分类在这个简单的案例研究中,将研究图像分类问题,其限制是每个类别的训练样本数量非常少。我们的问题的数据集可以在Kaggle上获得,并且是最流行的基于计算机视觉的数据集之一。
主要目标
我们将使用的数据集来自非常受欢迎的Dogs vs. Cats Challenge(https://www.kaggle.com/c/dogs-vs-cats/data),我们的主要目标是建立一个深度学习模型,可以成功识别图像并将其分类为猫或狗。
就ML而言,这是基于图像的二元分类问题。
构建数据集
首先,从数据集页面下载train.zip文件并将其存储在本地系统中。下载后,将其解压缩到一个文件夹中。该文件夹将包含25,000张狗和猫的图像;也就是说,每个类别12,500张图片。虽然我们可以使用所有25,000个图像并在它们上构建一些漂亮的模型,但如果你还记得,我们的问题目标包括每个类别拥有少量图像的附加约束。让我们为此建立我们自己的数据集。
现在让我们加载原始训练数据文件夹中的所有图像,如下所示:
我们可以使用前面的输出验证,我们每个类别有12,500张图像。现在让我们构建较小数据集,以便我们有3,000个用于训练的图像,1,000个用于验证的图像,以及用于我们的测试数据集的1,000个图像(两个动物类别具有相同的表示)。
现在已经创建了我们的数据集,让我们将它们写在我们的磁盘中的单独文件夹中,以便我们可以在将来的任何时候回到它们,而不必担心它们是否存在于我们的主存储器中。
由于这是一个图像分类问题,我们将利用CNN模型或ConvNets来尝试解决这个问题。我们将从头开始构建简单的CNN模型,然后尝试改进使用正则化和图像增强等技术。然后,我们将尝试利用预先训练的模型来释放迁移学习的真正力量!
准备数据集
在我们进入建模之前,加载并准备我们的数据集。首先,我们加载一些基本依赖项。
现在让我们使用以下代码片段来加载我们的数据集。
我们可以清楚地看到有3000个训练图像和1000个验证图像。每个图像的大小为150 x 150,并有三个红色、绿色和蓝色通道(RGB),因此每个图像的尺寸为(150,150,3)。我们现在将每个图像的像素值在(0,255)之间缩放到(0,1)之间的值,因为深度学习模型对于小输入值非常有效。
前面的输出显示了我们的训练数据集中的一个样本图像。现在让我们设置一些基本的配置参数,并将我们的文本类标签编码为数值(否则,Keras会抛出错误)。
我们可以看到,我们的编码方案将数字0分配给cat标签,将1分配给dog标签。我们现在准备建立第一个基于CNN的深度学习模型。
简单的CNN模型从零开始
我们将首先构建一个带有三个卷积层的基本CNN模型,再加上最大池,用于从我们的图像中自动提取特征,并对输出卷积特征图进行下采样。
这里我们假设您对CNN有足够的了解,因此不会涵盖理论细节。让我们现在利用Keras并构建我们的CNN模型架构。
前面的输出显示了我们的基本的CNN模型摘要。就像我们之前提到的那样,我们使用三个卷积层进行特征提取。flatten层用来平化我们从第三个卷积层输出的17 x 17个特征图中的128个。这被送到我们的密集层,以最终预测图像应该是狗(1)还是猫(0)。所有这些都是模型训练过程的一部分,所以让我们使用以下片段来训练我们的模型,该片段利用了fit(...)函数。
以下术语对于训练我们的模型非常重要:
batch_size指示每次迭代传递给模型的图像总数。每次迭代后更新层中单元的权重。迭代总数始终等于训练样本总数除以batch_size一个纪元是整个数据集通过网络一次,也就是说,所有迭代都是基于数据批次完成的。我们使用batch_size为30,我们的训练数据总共有3,000个样本,这表明每个时期总共有100次迭代。我们对该模型进行了总共30个epochs的训练,并在我们的1000张图像验证集上进行验证。
根据巡览和验证准确度值,我们的模型看起来有点过度拟合。我们可以使用以下代码段绘制模型的准确性和错误,以获得更好的视角。
您可以清楚地看到,在2-3个epochs之后,模型开始过度拟合训练数据。我们在验证集中获得的平均准确度约为72%,这不是一个糟糕的开始!我们可以改进这个模型吗?
CNN模型的正则化
让我们通过添加一个卷积层,另一个密集的隐藏层来改进我们的基本CNN模型。除此之外,我们将在每个隐藏的密集层之后添加0.3的dropout以实现正则化。基本上,dropout是在深度神经网络中正则化的有效方法。它可以单独应用于输入图层和隐藏图层。Dropout通过将输出设置为零来随机屏蔽一层单元的输出。
您可以从前面的输出中清楚地看到,我们仍然最终过度拟合模型,虽然它需要稍微长一点,我们也获得了大约78%的稍微更好的验证准确度,这很体面但不惊人。模型过度拟合的原因是因为我们的训练数据少得多,并且模型在每个时期内不断看到相同的实例。解决这个问题的一种方法是利用图像增强策略来增强我们现有的训练数据,其中的图像是现有图像的微小变化。我们将在下一节中详细介绍这一点。让我们暂时保存这个模型,以便我们以后可以使用它来评估它在测试数据上的性能。
具有图像增强的CNN模型
让我们通过使用适当的图像增强策略添加更多数据来改进我们的正则化CNN模型。由于我们之前的模型每次都在相同的小数据点样本上进行训练,因此无法很好地概括并在几个epochs之后结束过度拟合。图像增强背后的想法是我们遵循从训练数据集中获取现有图像并对其应用一些图像变换操作的设定过程,例如旋转、剪切、平移、缩放等,以生成新的,更改的版本现有图像由于这些随机变换,我们每次都没有得到相同的图像,我们将利用Python生成器在训练期间将这些新图像输入到我们的模型中。
Keras框架有一个很棒的实用工具,叫做ImageDataGenerator,可以帮助我们完成上述所有操作。让我们为训练和验证数据集初始化两个数据生成器。
ImageDataGenerator中有很多选项,我们刚刚使用了其中的一些选项。请随时查看文档以获得更详细的视角。在我们的训练数据生成器中,我们接收原始图像,然后对它们执行几次转换以生成新图像。这些包括以下内容。
使用zoom_range参数将图像随机缩放0.3倍。使用rotation_range参数将图像随机旋转50度。使用width_shift_range和height_shift_range参数,以图像宽度或高度的0.2倍随机水平或垂直平移图像。使用shear_range参数随机应用基于剪切的变换。使用horizontal_flip参数随机翻转一半图像。在应用任何前述操作(尤其是旋转或平移)之后,利用fill_mode参数填充图像的新像素。在这种情况下,我们只用最近的周围像素值填充新像素。让我们看看这些生成的图像中的一些看起来如何,以便您可以更好地理解它们。我们将从训练数据集中获取两个样本图像来说明相同的图像。第一张图片是猫的图像。
您可以在上一个输出中清楚地看到我们每次生成新版本的训练图像(使用平移、旋转和缩放),并且我们还为其分配了cat标签,以便模型可以从这些图像中提取相关要素,同时还要记住这些是猫。让我们看看图像增强现在如何对样本狗图像起作用。
这向我们展示了图像增强如何帮助创建新图像,以及如何对模型进行训练有助于对抗过度拟合。请记住,对于我们的验证生成器,我们只需要将验证图像(原始图像)发送到模型进行评估;因此,我们只是缩放图像像素(在0-1之间)并且不应用任何变换。我们只在我们的训练图像上应用图像增强变换。现在使用我们创建的图像增强数据生成器训练具有正则化的CNN模型。我们将使用之前的相同模型架构。
我们的优化器可以将默认学习率降低10倍,以防止模型卡在局部最小值或过度拟合中,因为我们将通过随机变换发送大量图像。为了训练模型,我们现在需要稍微修改我们的方法,因为我们正在使用数据生成器。我们将利用Keras的fit_generator(...)函数来训练此模型。 train_generator每次生成30个图像,因此我们将使用steps_per_epoch参数并将其设置为100,以根据每个epoch的训练数据对3,000个随机生成的图像训练模型。我们的val_generator每次生成20个图像,因此我们将validation_steps参数设置为50,以验证所有1,000个验证图像的模型精度(请记住,我们不会增加验证数据集)。
我们的验证准确度跃升至82%左右,比我们之前的型号高出近4-5%。此外,我们的训练精度与我们的验证精度非常相似,表明我们的模型不再过度拟合。以下描述了每个epoch的模型精度和损失。
虽然验证准确性和损失有一些高峰,但总体而言,我们发现它更接近于训练准确性,损失表明我们获得的模型与我们之前的模型相比更加概括。现在让我们保存这个模型,以便稍后可以在我们的测试数据集上进行评估。
我们现在将尝试利用迁移学习的力量来确定我们是否可以构建更好的模型!
利用预先训练的CNN模型与迁移学习
在构建新模型或重用它们时,预先训练的模型以下列两种常用方式使用:
使用预先训练的模型作为特征提取器
微调预先训练的模型
我们将在本节中详细介绍它们。本章中使用的预训练模型是由牛津大学的视觉几何小组创建的流行的VGG-16模型,该模型专门构建用于大规模视觉识别的非常深的卷积网络。
像VGG-16这样的预训练模型是一个已经预先训练过的模型,它位于具有大量不同图像类别的大型数据集(ImageNet)上。考虑到这一事实,该模型应该已经学习了一个强大的特征层次结构,这些特征是关于CNN模型学习的特征的空间、旋转和平移不变量。因此,该模型已经学习了对属于1,000个不同类别的超过一百万个图像的特征的良好表示,可以作为适合于计算机视觉问题的新图像的良好特征提取器。这些新图像可能永远不会存在于ImageNet数据集中,也可能是完全不同的类别,但这些模型仍应能够从这些图像中提取相关要素。
这使我们有一个优势,即使用预先训练的模型作为新图像的有效特征提取器,解决各种复杂的计算机视觉任务,例如用较少的图像解决我们的猫与狗分类器,甚至构建狗品种分类器,面部表达式分类器,还有更多!接下来,让我们简要讨论一下VGG-16的模型架构。
了解VGG-16模型
VGG-16模型是基于ImageNet数据库构建的16层(卷积和完全连接)网络,该数据库是为图像识别和分类而构建的。这个模型由Karen Simonyan和Andrew Zisserman建造,并在他们的题为“用于大规模图像识别的超深度卷积网络”的论文中有提到。我建议所有感兴趣的读者都可以去阅读本文中的优秀文献。 VGG-16模型的架构如下图所示。
您可以清楚地看到我们总共有13个卷积层,使用3 x 3卷积滤波器以及用于下采样的最大池层,并且每层中总共有两个完全连接的4096个单元的隐藏层,接着是1000个单元的密集层,其中每个单元代表ImageNet数据库中的一个图像类别。我们不需要最后三层,因为我们将使用自己的完全连接的密集层来预测图像是狗还是猫。我们更关注前五个块,以便我们可以利用VGG模型作为有效的特征提取器。
对于其中一个模型,我们将它作为一个简单的特征提取器,通过冻结所有五个卷积块来确保它们的权重在每个epoch后都不会更新。对于最后一个模型,我们将对VGG模型进行微调,在那里我们将解冻最后两个块(块4和块5),以便在我们训练的每个时期(每批数据)更新它们的权重。我们将在下面的框图中代表前面的体系结构,以及我们将要使用的两个变体(基本特征提取器和微调),以便您可以获得更好的视觉透视图。
因此,我们主要关注的是利用VGG-16模型的卷积块然后 flatten最终输出(从特征图中),以便我们可以将它馈送到我们自己的分层器的密集层中。
预先训练的CNN模型作为特征提取器
让我们利用Keras,加载VGG-16模型,并冻结卷积块,以便我们可以将它用作图像特征提取器。
从前面的输出可以清楚地看出,VGG-16模型的所有层都是冻结的,这很好,因为我们不希望它们的权重在模型训练期间发生变化。 VGG-16模型中的最后一个激活特征映射(来自block5_pool的输出)为我们提供了瓶颈特征,然后可以将其flatten并馈送到完全连接的深度神经网络分类器。以下代码段显示了我们的训练数据中样本图像的瓶颈特征。
我们 flatten vgg_model对象中的瓶颈特征,以使它们可以被馈送到我们的完全连接的分类器。在模型训练中节省时间的一种方法是使用此模型并从训练和验证数据集中提取所有特征,然后将它们作为输入提供给我们的分类器。让我们现在从训练和验证集中提取出瓶颈特征。
前面的输出告诉我们,我们已成功为我们的3,000张训练图像和1,000张验证图像提取了尺寸为1 x 8192的瓶颈特征。让我们现在构建深度神经网络分类器的架构,它将这些功能作为输入。
就像我们之前提到的那样,大小为8192的瓶颈特征向量作为我们分类模型的输入。对于密集层,我们使用与之前模型相同的架构。我们现在就训练这个模型吧。
我们得到的模型的验证准确度接近88%,几乎比我们的基本CNN模型的图像增强提高了5-6%,这是非常好的。该模型似乎确实过度拟合。在第五个时期之后,模型训练和验证准确性之间存在相当大的差距,这清楚地表明模型在此之后过度拟合训练数据。但总的来说,这似乎是迄今为止最好的模型。让我们尝试在这个模型上使用我们的图像增强策略。在此之前,我们使用以下代码将此模型保存到磁盘。
预训练的CNN模型作为具有图像增强的特征提取器
我们将为我们之前使用过的训练和验证数据集利用相同的数据生成器。为了便于理解,构建它们的代码如下所示。
现在让我们构建深度学习模型并进行训练。我们不会像上次那样提取瓶颈特征,因为我们将对数据生成器进行训练;因此,我们将vgg_model对象作为输入传递给我们自己的模型。我们将学习率略微降低,因为这里会训练100个epoch,并且不希望对我们的模型层进行任何突然的权重调整。请记住,VGG-16模型的图层仍然在此冻结,我们仍然只将其用作基本特征提取器。
我们可以看到模型总体验证准确度为90%,这比我们之前的模型略有改进,并且训练和验证精度彼此非常接近,表明该模型不会过度拟合。现在让我们将此模型保存在磁盘上,以便将来评估测试数据。
我们现在将微调VGG-16模型以构建我们的最后一个分类器,我们将解冻块4和5,正如我们在前面的框图中所描述的那样。
具有微调和图像增强功能的预训练CNN模型
我们现在将利用存储在vgg_model变量中的VGG-16模型对象,并解冻卷积块4和5,同时保持前三个块冻结。以下代码可帮助我们实现这一目标。
您可以从前面的输出中清楚地看到,与块4和5相关的卷积和池化层现在是可训练的。这意味着当我们传递每批数据时,这些层的权重也将在每个epoch使用反向传播进行更新。我们将使用与之前模型相同的数据生成器和模型体系结构,并训练我们的模型。我们稍微降低了学习率,因为我们不希望卡在任何局部最小值,我们也不希望突然更新可训练的VGG-16模型层的权重,这可能会对模型产生不利影响。
从前面的输出我们可以看出,模型已经获得了大约96%的验证准确度,比我们之前的模型提高了6%。总体而言,该模型从我们的第一个基本CNN模型中获得了24%的验证准确度提升。这真实地展示了迁移学习的有用性。我们可以看到精度值在这里非常出色,虽然模型看起来可能略微过度拟合了训练数据,但我们仍然可以获得很好的验证准确性。我们现在使用以下代码将此模型保存到磁盘。
现在让我们通过实际评估测试数据集的性能来测试所有的模型。
在测试数据上评估我们的深度学习模型
我们现在将通过首先在我们的测试数据集上测试它们来评估我们迄今为止构建的五种不同模型,因为仅仅验证是不够的!我们还构建了一个名为model_evaluation_utils的漂亮的实用程序模块,我们将使用它来评估深度学习模型的性能。在开始之前,让我们加载必要的依赖项和我们保存的模型。
现在是进行最终测试的时候了,我们通过对测试数据集进行预测来测试模型的性能。在我们尝试进行预测之前,让我们首先加载并准备我们的测试数据集。
现在我们准备好了缩放数据集,让我们通过对所有测试图像进行预测来评估每个模型,然后通过检查预测的准确性来评估模型性能。
模型1:基本CNN性能
模型2:具有图像增强性能的基本CNN
模型3:迁移学习 - 预训练的CNN作为特征提取器的性能
模型4:迁移学习 - 预训练的CNN作为具有图像增强性能的特征提取器
模型5:迁移学习 - 具有微调和图像增强性能的预训练CNN
可以看到,我们确实有一些有趣的结果。每个后续模型都比之前的模型表现更好,这是预期的,因为我们在每个新模型中尝试了更高级的技术。
我们最差的模型是基本的CNN模型,模型精度和F1分数约为78%,我们最好的模型是微调模型,具有迁移学习和图像增强,这给我们一个模型精度和F1得分96%,考虑到我们从3,000个图像训练数据集训练我们的模型,这真是太神奇了。让我们绘制一下最差和最好模型的ROC曲线。
这可以让您很好地了解预先训练的模型和迁移学习可以产生多大差异,特别是在我们遇到像数据较少的约束时解决复杂问题时。我们鼓励您使用自己的数据尝试类似的策略!
案例研究2:具有大量类和更少数据可用性的多类细粒度图像分类
现在在这个案例研究中,让我们升级游戏,使图像分类的任务更加令人兴奋。我们在之前的案例研究中构建了一个简单的二元分类模型(尽管我们使用了一些复杂的技术来解决小数据约束问题!)。在本案例研究中,我们将专注于细粒度图像分类的任务。与通常的图像分类任务不同,细粒度图像分类是指在较高级别的类中识别不同子类的任务。
主要目标
为了更好地理解这项任务,我们将围绕Stanford Dogs数据集进行讨论。顾名思义,该数据集包含不同犬种的图像。在这种情况下,任务是识别每个犬种。因此,高级概念是狗本身,而任务是正确地分类不同的子概念或子类——在本例中是品种。
我们将利用提供的Kaggle数据集。这里仅使用train数据集,因为它已标记数据。该数据集包含大约10,000个120种不同犬种的标记图像。因此,我们的任务是建立一个细粒度的120级分类模型,对120种不同的犬种进行分类。
加载和探索数据集
让我们看看数据集是如何通过加载数据和查看一批样本图像来实现的。
从前面的网格中,我们可以看到在分辨率、光照、缩放级别等方面存在很多变化,以及图像不仅仅包含一只狗而且包含其他狗和周围环境的事实。项目也是如此。这将是一个挑战!
构建数据集
让我们首先看看数据集标签是如何形成的,以了解我们正在处理的内容。
我们接下来要做的是使用以下代码为磁盘中存在的每个图像添加精确的图像路径。这将有助于我们在模型训练期间轻松定位和加载图像。
现在是时候准备我们的训练、测试和验证数据集了。我们将利用以下代码来帮助我们构建这些数据集!
我们还需要将文本类标签转换为单热编码标签,否则我们的模型将无法运行。
一切看起来都井然有序。现在,如果您记得上一个案例研究,图像增强是处理每个类别较少数据的好方法。在这种情况下,我们共有10222个样本和120个类。这意味着,每类平均只有85张图片!我们使用keras的ImageDataGenerator实用程序执行此操作。
现在我们准备好了数据,下一步就是真正构建我们的深度学习模型!
使用Google的初始V3模型进行迁移学习
现在我们的数据集已准备就绪,接下来进入使用建模过程。我们已经知道如何从头开始构建深度卷积网络。我们还了解实现良好性能所需的微调量。对于这项任务,我们将利用迁移学习的概念。预先训练的模型是开始迁移学习任务所需的基本要素。
在本案例研究中,我们将集中精力利用预先训练的模型作为特征提取器。我们知道,深度学习模型基本上是神经元互连层的堆叠,最后一层充当分类器。该架构使深度神经网络能够捕获网络中不同级别的不同特征。因此,我们可以利用此属性将它们用作特征提取器。这可以通过移除最后一层或使用倒数第二层的输出来实现。然后将来自倒数第二层的该输出馈送到另一组层中,接着是分类层。我们将使用Google的Inception V3模型作为我们预先训练的模型。
根据之前的输出,您可以清楚地看到Inception V3模型非常庞大,有很多层和参数。让我们现在开始训练我们的模型。我们使用fit_generator(...)方法训练模型,以利用上一步中准备的数据增强。我们将批量大小设置为32,并将模型训练15个epoch。
该模型在15个epoch内,在训练和验证装置上都实现了超过80%的准确度。右侧的图显示了损失下降并收敛到0.5左右的速度。这是一个明确的例子,说明迁移学习十分强大且简单。
评估我们的测试数据深度学习模型
训练和验证性能非常好,但是看不见的数据表现如何呢?因为我们已经将原始数据集分成三个独立的部分。这里要记住的重要一点是测试数据集必须经历与训练数据集类似的预处理。为了解释这一点,我们也会在将测试数据集输入函数之前对其进行缩放。
该模型在测试数据集上实现了惊人的86%的准确度以及F1分数。鉴于我们刚刚训练了15个epoch而我们的投入又很少,迁移学习帮助我们实现了相当不错的分类器。我们还可以使用以下代码检查每个类别的分类指标。
我们还可以使用以下代码以视觉上吸引人的方式可视化模型预测。
上图提供了模型性能的可视化证明。正如我们所看到的,在大多数情况下,该模型不仅可以预测正确的犬种,而且还具有非常高的可信度。
迁移学习优势
我们已经在前面几节中以某种方式介绍了迁移学习的几个优点。通常,迁移学习使我们能够构建更强大的模型,这些模型可以执行各种各样的任务。
通过多种约束帮助解决复杂的现实问题解决几乎没有标记数据可用性的问题易于根据域和任务将知识从一个模型转移到另一个模型提供未来某一天实现人工智能的途径!迁移学习挑战
迁移学习具有巨大的潜力,是现有学习算法的常用增强功能。然而,有一些与迁移的相关问题需要更多的研究和探索。除了难以回答什么、何时以及如何迁移的问题之外,负迁移和迁移限制也是主要挑战。
负迁移:我们到目前为止讨论的案例讨论了基于源任务的知识转移的目标任务的改进。有些情况下,迁移学习会导致绩效下降。负迁移是指从源到目标的知识转移不会导致任何改进,而是导致目标任务的整体性能下降的情况。负迁移可能有多种原因,例如源任务与目标任务没有充分关联的情况,或者传输方法无法很好地利用源和目标任务之间的关系。避免负迁移非常重要,需要仔细调查。在他们的工作中,Rosenstien和他们的合著者凭经验提出,当源和目标太不相似时,蛮力迁移如何降低目标任务的性能。正在研究Bakker及其合著者的贝叶斯方法,以及探索基于聚类的解决方案以识别相关性的其他技术,以避免负面迁移。迁移界限:量化迁移学习中的迁移对于迁移权重及其可行性也是非常重要的。为了衡量迁移的数量,哈桑马哈茂德和他们的合作者使用Kolmogorov复杂性证明了某些理论界限来分析迁移学习和衡量任务之间的相关性。伊顿和他们的合著者提出了一种新的基于图表的方法来衡量知识迁移。这些技术的详细讨论超出了本文的范围。我们鼓励读者使用本节中概述的出版物探索有关这些主题的更多信息!结论和未来范围
这可能是我最长的文章之一,全面涵盖了迁移学习概念、策略,专注于深度迁移学习、挑战和优势。我们还介绍了两个实际的实际案例研究,以便您了解如何实现这些技术。
迁移学习肯定会成为机器学习和行业主流应用中深度学习成功的关键驱动因素之一。我绝对希望看到更多预先训练的模型和创新的案例研究,它们利用这一概念和方法。
NLP的迁移学习音频数据传输学习生成性深度学习的迁移学习更复杂的计算机视觉问题,如图像字幕让我们希望有关转迁移学习和深度学习的更多成功案例,这使我们能够建立更智能的系统,让世界变得更美好,并推动我们自己的个人目标!
声明:本文由"麦兜"发布,不代表"知识分享"立场,转载联系作者并注明出处:https://www.029ipr.com/law/12742.html