本章包括:
1、了解卷积神经网络(convnets)
2、使用数据增强来减轻过度拟合
3、使用预训练的convnet进行特征提取
4、微调预训练的信号
5、可视化回馈学习的内容以及他们如何做出分类决策
一、引言
一个简单的convnet示例。
第二章中的密接网络的测试精度为97.8%,而convnet的测试精度为99.3%:我们将错误率降低了68%(相对)。为什么这个简单的convnet比一个紧密连接的模型工作得那么好呢?为了回答这个问题,让我们深入研究conv2d和maxpooling2d层的作用。
1、卷积操作
密集连接层和卷积层的根本区别在于:密集层在其输入特征空间中学习全局模式(例如,对于mnist数字,涉及所有像素的模式),而卷积层学习局部模式(参见图5.1):对于图像,在输入。在前面的示例中,这些窗口都是3×3。
这个关键特性为convnets提供了两个有趣的属性:
- 他们学习的模式是翻译不变的—学习了这种模式之后,convnets可以在别的任何地方识别出来;这使得convnets在处理图像时的数据效率更高(因为视觉世界基本上是不变的)。
-
他们可以学习模式的空间层次结构(见图5.2)。 第一卷积层将学习诸如边缘的小局部图案,第二卷积层将学习由第一层的特征构成的较大图案,等等。 这使得convnets能够有效地学习越来越复杂和抽象的视觉概念(因为视觉世界从根本上讲是空间分层的)。
卷积作用于称为特征映射的三维张量上,它有两个空间轴(高度和宽度)和一个深度轴(也称为通道轴)。对于RGB图像,深度轴的尺寸为3,因为图像有三个颜色通道:红色、绿色和蓝色。对于黑白图片,像mnist数字一样,深度为1(灰度)。
卷积操作从其输入特征映射中提取补丁,并对所有这些补丁应用相同的转换,生成输出特征映射。这个输出特征映射仍然是一个三维张量:它有一个宽度和一个高度。它的深度可以是任意的,因为输出深度是图层的一个参数,并且该深度轴上的不同通道不再代表特定的颜色,就像在RGB输入中一样;相反,它们代表过滤器。
过滤器对输入数据的特定方面进行编码:例如,在高层,一个过滤器可以对“输入中存在一个面”的概念进行编码。在mnist示例中,第一个卷积层获取大小为(28、28、1)的特征映射并输出大小为(26、26、32)的特征映射:它在其输入上计算32个过滤器。这32个输出通道中的每个通道都包含一个26×26的网格值,这是输入端滤波器的响应图,指示该滤波器模式在输入端不同位置的响应(见图5.3)。这就是术语“特征映射”的含义:深度轴中的每个维度都是特征(或过滤器),而二维张量输出[:,:,n]是该过滤器对输入响应的二维空间映射。
卷积由两个关键参数定义: - 从输入中提取的补丁大小—通常为3×3或5×5
-
输出特征映射的深度—由卷积计算的滤波器数量。该示例的开始深度为32,结束深度为64。
在keras conv2d层中,这些参数是传递给层的第一个参数:Conv2D(output_depth, (window_height, window_width)) 卷积的工作原理是将这些尺寸为3×3或5×5的窗口滑动到三维输入特征映射上,在每个可能的位置停止,并提取周围特征的三维面片(shape (window_height, window_width, input_depth)) 然后,所有这些向量在空间上重新组合成三维形状输出图(height,width, output_depth) 输出特征映射中的每个空间位置对应于输入特征映射中的相同位置(例如,输出的右下角包含有关输入右下角的信息)。例如,使用3×3窗口时,矢量输出[i, j, :]来自3D补丁输入[i-1:i+1, j-1:j+1, :]。整个过程如图5.4所示。
注意,输出宽度和高度可能与输入宽度和高度可能因两个原因而不同: - Border effects:可通过填充输入特征映射来抵消。
-
The use of strides
填充:如果要获得与输入空间尺寸相同的输出特征映射,可以使用填充。填充包括在输入功能图的每一侧添加适当数量的行和列,以便在每个输入图块周围放置中心卷积窗口。
在conv2d层中,padding可通过padding参数进行配置,padding参数采用两个值:“valid”,表示没有padding(只使用有效的窗口位置);“same”(相同),表示“pad的方式使输出具有与输入相同的宽度和高度。”padding参数默认为“valid”。
影响输出大小的另一个因素是步幅的概念。迄今为止对卷积的描述假定卷积窗口的中心瓷砖都是连续的。但两个连续窗口之间的距离是卷积,称为步幅,默认为1。跨步卷积:跨步大于1的卷积。在图5.7中,可以看到通过3×3卷积在5×5输入(不带填充)上使用跨距2提取的补丁。
使用“跨距2”意味着特征地图的宽度和高度将被一个系数2(除了由边界效果引起的任何变化)所减小。跨步卷积在实践中很少使用,尽管对于某些类型的模型来说,跨步卷积可以派上用场;为了缩小功能图的样本,我们倾向于使用max pooling操作,而不是跨步,在第一个convnet示例中在action中看到了这一操作。
2、最大池操作
max pooling的作用:大幅缩小feature maps的样本,很像跨步卷积。最大池包括从输入功能图中提取窗口并输出每个通道的最大值。它在概念上类似于卷积,除了通过学习的线性变换(卷积核)转换局部补丁之外,它们通过硬编码的max张量操作进行转换。与卷积的一个大区别是,最大池通常使用2×2窗口和跨步2来完成,以便将特征映射的采样率降低2倍。卷积通常是用3×3个窗口完成的,没有跨距(跨距1)。使用降采样的原因是减少要处理的特征映射系数的数量,并通过使连续的卷积层查看越来越大的窗口(根据它们覆盖的原始输入的比例)来诱导空间滤波器层次。
注意,最大池并不是实现这种降采样的唯一方法。还可以在先前的卷积层中使用跨步。可以使用平均池而不是最大池,其中每个本地输入补丁都是通过在补丁上取每个通道的平均值而不是最大值来转换的,但是最大池比这些可选的解决方案工作得更好。
最合理的子采样策略是首先生成密集的特征图(通过无重叠卷积),然后查看小补丁上特征的最大激活,而不是查看输入窗口较稀疏(通过跨步卷积)或平均输入补丁,这可能会导致您错过或稀释特征-P重置信息。
此时,应该了解convnets特性图、卷积和max pooling的基本知识,并且知道如何构建一个小的convnet来解决诸如mnist digits分类之类的问题。
二、在小数据集上从头开始训练convnet
只有很少的数据来训练一个图像分类模型是一种常见的情况,在这个例子里,我们将把图像分类为“狗”或“猫”,在一个包含4000张猫和狗(2000只猫,2000只狗)图片的数据集中。我们将使用2000张图片进行训练,1000张用于验证,最后1000张用于测试。
在本节中,我们将回顾一个解决这个问题的基本策略:从头开始培训一个新模型,我们拥有的数据量很少。我们将从2000个训练样本上训练一个小的convnet开始,不进行任何正规化,为可以达到的目标设定一个基线。这将使我们的分类精度达到71%。在那一点上,我们的主要问题将是过度拟合。然后我们将介绍数据增强,这是一种减轻计算机视觉中过拟合的强大技术。通过利用数据扩充,我们将改进我们的网络,使其精度达到82%。
在下一节中,我们将回顾将深度学习应用于小数据集的两个更重要的技术:使用预先训练的网络进行特征提取(这将使我们的精度达到90%到93%),以及对预先训练的网络进行微调(这将使我们的最终精度达到95%)。总之,这三种策略——从头开始训练一个小模型,使用预先训练的模型进行特征提取,以及微调预先训练的模型——将构成未来解决使用小数据集进行计算机视觉的问题的工具箱。
1、 深度学习对小数据问题的相关性
有时我们会觉得,只有在有大量数据可用时,深度学习才有效。这在一定程度上是一个有效的观点:深度学习的一个基本特征是,它能够自己在训练数据中发现有趣的特性,而不需要任何手动特性工程,并且只有在有大量训练示例的情况下才能实现。这对于输入样本是高维的问题尤其适用,比如图像。
然而,相对于您试图训练的网络的大小和深度而言构成“大量”样本的因素是相对的。用几十个样本训练一个convnet来解决一个复杂的问题是不可能的,但是如果模型很小并且很好地规范化,并且任务很简单,那么几百个样本就可能足够了。由于convnet学习了局部的、翻译不变的特征,因此它们在感知问题上具有很高的数据效率。从零开始在一个非常小的图像数据集上训练convnet仍然会产生合理的结果,尽管相对缺乏数据,但不需要任何定制的特性工程。
更重要的是,深度学习模型本质上是高度可重用的:例如,可以采用在大型数据集上训练的图像分类或语音到文本模型,在显著不同的问题上重用它,只需进行微小的更改。具体来说,在计算机视觉的情况下,许多预先训练的模型(通常在ImageNet数据集上训练)现在可以公开下载,并且可以用于从非常少的数据中引导强大的视觉模型。这就是我们将在下一节中要做的。现在,从掌握数据开始。
2、 下载数据
https://www.kaggle.com/c/dogs-vs-cats/data
下载并解压缩后,我们将创建一个包含三个子集的新数据集:训练集每个类有1000个样本,一个验证集每个类有500个样本,最后一个测试集每个类有500个样本。原始数据集包含25000张狗和猫的图像(每类12500张)。每个类的样本数是相同的:这是一个平衡的二分分类问题,这意味着分类的准确性将是成功的适当度量。
3、 构建网络
我们的convnet将是一个交替的conv2d(带有relu激活)和maxpooling2d层的堆栈。对于编译步骤,我们将像往常一样使用RMSprop优化器,loss的选择:binary crossentropy
4、 数据预处理
在将数据输入我们的网络之前,应该将数据格式化为适当的预处理浮点张量。目前,我们的数据以jpeg文件的形式存储在驱动器上,因此将其导入网络的步骤大致如下:
- 阅读图片文件。
- 将jpeg内容解码为像素的RBG网格。
- 把它们转换成浮点张量。
- 将像素值(介于0和255之间)重新调整为[0,1]间隔(神经网络擅长处理较小的输入值)。
keras有一个带有图像处理助手工具的模块,位于keras.preprocessing.image。特别的是,它包含了ImageDataGenerator类,它允许快速设置python生成器,该生成器可以自动将磁盘上的图像文件转换成批预处理张量。这是我们将在这里使用的。
然后使用fit_generator的方法实现生成器将模型与数据相拟合。
在训练后始终保存我们的模型。
用训练和验证数据来绘制模型在训练期间的loss 和accuracy。
由于训练样本相对较少,出现了过度拟合的现象,采用数据增强的方法来缓解过度拟合。
5、 使用数据增强
数据增强采用从现有训练样本生成更多训练数据的方法,通过一些随机转换“增强”样本,生成可信的图像。我们的目标是,在培训时,我们的模型不会看到完全相同的图片两次。这有助于模型暴露于数据的更多方面,并更好地进行归纳。在Keras中,这可以通过配置要对ImageDataGenerator实例读取的图像执行的多个随机转换来完成。一个例子:
- rotation_range是一个以度(0-180)为单位的值,在这个范围内可以随机旋转图片。
- width_shift和height_shift 是一个范围(作为总宽度或总高度的一部分),在这个范围内可以随机地垂直或水平地翻译图片。
- shear_range 是指随机应用剪切变换。
- zoom_range 用于在图片内随机缩放。
- horizontal_flip是指将一半图像随机水平翻转,这与没有水平不对称假设(如真实图像)相关。
- fill_mode 是用于填充新创建的像素的策略,这些像素可以在旋转或宽度/高度移动后出现。
三、使用预先训练的convnet
对小图像数据集进行深入学习的一种常见且高效的方法是利用预先培训过的网络。预先训练的网络只是一个保存的网络,以前是在一个大型数据集上训练的,通常是在一个大型图像分类任务上。
在我们的例子中,我们将考虑在ImageNet数据集上训练的大型convnet(140万个标记图像和1000个不同的类)。Imagenet包含许多动物类别,包括不同种类的猫和狗,因此我们可以期望在猫和狗的分类问题上表现出色。
我们将使用由Karen Simonyan和Andrew Zisserman于2014年开发的VGG16架构,这是一种简单且广泛使用的用于Imagenet的convnet架构。
利用预先培训的网络有两种方法:特征提取和微调。我们将涵盖这两个方面。让我们从特征提取开始。
1、 特征提取
特征提取包括使用以前网络学习的表示从新样本中提取有趣的特征。然后,这些特性通过一个新的分类器运行,这个分类器是从零开始训练的。
正如我们前面做的,用于图像分类的convnets由两部分组成:它们从一系列池和卷积层开始,最后是一个紧密连接的分类器。第一部分是模型的“卷积基”。在convnets里,“特征提取”将简单地包括获取先前训练的网络的卷积基,通过它运行新的数据,并在输出的顶部训练一个新的分类器。
为什么只重用卷积基?我们也可以重用密接分类器吗?一般来说,最好不要这样做。另外,如果我们新数据集与训练原始模型的数据集有很大不同,那么最好只使用模型的前几层进行特征提取,而不是使用整个卷积基。
在我们的例子中,由于imagenet类集确实包含多个dog和cat类,因此重用原始模型的紧密连接层中包含的信息可能会有所帮助。然而,我们将选择不这样做,以涵盖更一般的情况,即新问题的类集不与原始模型的类集重叠。我们通过使用在ImageNet上训练的VGG16网络的卷积基,从猫和狗的图像中提取有趣的特征,然后在这些特征的基础上训练猫和狗的分类器,来实践这一点。VGG16型号,以及其他型号,都预装了Keras。可以从keras.applications模块导入它。以下是作为keras.applications的一部分提供的图像分类模型列表(所有对ImageNet数据集进行过预培训)。
- Xception
- InceptionV3
- ResNet50
- VGG16
- VGG19
- MobileNet
我们通过使用在ImageNet上训练的VGG16网络的卷积基,从猫和狗的图像中提取特征,然后在这些特征的基础上训练猫和狗的分类器,来实践这一点。步骤:
1) 实例化vg16模型
2) 特征提取的两种方法:
方法一:在数据集上运行卷积基,将其输出记录到磁盘上的一个numpy数组中,然后使用这个日期作为一个独立的、紧密连接的分类器的输入,类似于本书第一章中所看到的。这个解决方案运行起来非常快速和便宜,因为它只需要对每个输入图像运行一次卷积基,而卷积基是迄今为止管道中最昂贵的部分。然而这种技术根本不允许我们利用数据扩充。
方法二:扩展我们的模型(conv-),在顶部添加密集层,并在输入数据上端到端地运行整个模型。这允许我们使用数据增强,因为每次模型看到每个输入图像都要经过卷积基。然而这种技术要比第一种技术代价更大。只能在GPU上运行。
这里因为模型的行为与层类似,所以可以向顺序模型添加模型(如conv_库),就像添加层一样。在我们编译和训练模型之前,要做的一件非常重要的事情是冻结卷积基。”“冻结”一层或一组层意味着在训练过程中防止权重得到更新。如果我们不这样做,那么之前由卷积基学习的表示将在训练期间被修改。由于顶部的密集层是随机初始化的,因此会通过网络传播非常大的权重更新,从而有效地破坏先前学习的表示。在keras中,通过将网络的可训练属性设置为false来冻结网络:conv_base.trainable = False。使用此设置,将只训练我们添加的两个密集层的权重。总共有四个权重张量:每层两个(主权重矩阵和偏移向量)。注意,为了使这些更改生效,我们必须首先编译模型。如果在编译之后修改了权重可训练性,那么应该重新编译模型,否则这些更改将被忽略。现在,我们可以开始培训我们的模型,使用前面示例中使用的相同的数据扩充配置。
2、 微调
另一种广泛使用的模型重用技术(与特征提取互补)是微调。微调包括解冻用于特征提取的冻结模型库的一些顶层,并联合训练模型的新添加部分(在我们的例子中,是完全连接的分类器)和这些顶层。这被称为“微调”,因为它稍微调整了被重用模型的更抽象的表示,以便使它们与手头的问题更相关。
我们之前已经说过,为了能够在顶部训练一个随机初始化的分类器,有必要冻结VGG16的卷积基。出于同样的原因,只有在对顶部分类器进行了训练之后,才能对卷积基的顶层进行微调。如果分类没有经过训练,那么在训练过程中通过网络传播的错误信号将太大,并且先前由被微调的层所学习的表示将被破坏。因此,对网络进行微调的步骤如下:
1)将我们自定义网络添加到已训练的基础网络之上。
2)冻结基础网络。
3)训练我们添加的部件。
4)解冻基础网络中的某些层。
5)共同训练这些层和添加的零件。
在进行特征提取时,我们已经完成了前3个步骤。让我们继续第四步:我们将解冻conv_基地,然后冻结里面的各个层。
卷积基中的早期层编码更通用、可重用的特性,而更高层编码更专业的特性。对更专业的特性进行微调更有用,因为这些特性是需要针对新问题重新调整用途的特性。在微调较低层时,会有快速降低的回报。
我们训练的参数越多,就越有过度拟合的风险。卷积基有1500万个参数,因此尝试在我们的小数据集上训练它是有风险的。
因此,在我们的情况下,只对卷积基中的前2到3层进行微调是一个很好的策略。我们将对最后3个卷积层进行微调,这意味着在Block4_池之前的所有层都应冻结,并且可以训练Block5_Conv1、Block5_Conv2和Block5_Conv3层。
微调过程如下:
1)让我们来设置它,从上一个例子中我们停止的地方开始
2)微调我们的网络。我们将使用rmsprop优化器,使用非常低的学习率来实现这一点。使用低学习率的原因是,我们希望将所做的修改的大小限制为我们正在微调的3个层的表示。太大的更新可能会损害这些表示。
3)根据测试数据最终评估此模型
这里我们得到了97%的测试精度。在最初围绕这个数据集的竞争中,这将是最重要的结果之一。然而,利用现代的深度学习技术,我们仅使用了一小部分可用的培训数据(约10%)就取得了这一结果。与2000个样本相比,能够训练20000个样本有很大的区别!
使曲线更易读的方法,我们可以用这些量的指数移动平均值来替换每一个损失和精度,从而使它们更平滑。下面是一个简单的实用程序函数:
3、 总结
- convnets是计算机视觉任务的最佳机器学习模型。甚至可以在一个非常小的数据集上从头开始训练一个数据集,结果也不错。
- 在小数据集上,过度拟合将是主要问题。在处理图像数据时,数据增强是一种有效的克服过度拟合的方法。
- 通过特征提取,很容易在新数据集上重用现有的convnet。这对于处理小图像数据集是一种非常有价值的技术。
- 作为对特征提取的补充,我们可以使用微调,它可以适应一个新的问题,一些现有模型以前学习的表示。这会进一步提高性能。
- 现在,我们有了一套处理图像分类问题的可靠工具,特别是处理小数据集的工具。
四、可视化convnets学习的内容
人们常说,深度学习模型是“黑匣子”,学习表示很难以人类可读的形式提取和呈现。虽然对于某些类型的深度学习模型,这是部分正确的,但对于convnets,这绝对不是正确的。convnets学习的表示非常容易可视化,这在很大程度上是因为它们是可视化概念的表示。我们将涵盖以下三方面:
1)可视化中间convnet输出(“中间激活”)。这有助于理解连续的convnet层如何转换其输入,并首先了解各个convnet过滤器的含义。
2)可视化convnets筛选器。这有助于准确理解convnet中每个过滤器所能接受的视觉模式或概念。
3)在图像中可视化类激活的热图。这有助于理解标识为属于给定类的图像的哪个部分,从而允许在图像中定位对象。
对于第一种方法——激活可视化——我们将使用两节前从零开始训练的小convnet来解决猫和狗的分类问题。对于接下来的两种方法,我们将使用上一节中介绍的vg16模型。
1、Visualizing intermediate activations
可视化中间激活包括显示由网络中各种卷积和池层输出的特征图,给定一个特定的输入(一个层的输出通常称为其“激活”,即激活函数的输出)。这就为输入如何分解为网络学习的不同过滤器提供了一个视图。我们要可视化的这些功能图有三个维度:宽度、高度和深度(通道)。每个通道编码相对独立的特征,因此可视化这些特征图的正确方法是将每个通道的内容作为二维图像单独标绘。
这里需要注意的几个重要事项:
- 第一层是各种边缘检测器的集合。在那个阶段,激活仍然保留了最初图片中的几乎所有信息。
- 随着我们向上走,激活变得越来越抽象,视觉解释能力也越来越差。他们开始编码更高级的概念,如“猫耳”或“猫眼”。更高级别的演示文稿包含的关于图像视觉内容的信息越来越少,与图像类别相关的信息也越来越多。
- 激活的稀疏性随着层的深度而增加:在第一层中,所有的过滤器都由输入图像激活,但在下面的层中,越来越多的过滤器是空白的。这意味着在输入图像中找不到由过滤器编码的模式。
深层神经网络所学习的表示的一个非常重要的普遍特征:一个层所提取的特征随着层的深度越来越抽象。更高层的激活会带来越来越少的关于所看到的特定输入的信息,以及越来越多的关于目标的信息(在我们的例子中,是图像的类别:猫或狗)。深度神经网络有效地充当信息蒸馏管道,原始数据进入(在我们的例子中,是RBG图片),并反复转换,以便过滤出不相关的信息(例如图像的特定视觉外观),而有用的信息被放大和细化(例如图像的类别)。
这类似于人类和动物感知世界的方式:观察一个场景几秒钟后,人类可以记住其中存在的抽象对象(如自行车、树),但无法记住这些对象的具体外观。事实上,如果你现在试图从脑海中画出一辆普通的自行车,很有可能你根本就不能把它画对,即使你一生中见过成千上万辆自行车。你的大脑已经学会了完全抽象它的视觉输入,把它转换成高层次的视觉概念,同时完全过滤掉不相关的视觉细节,这使得我们很难记住周围事物的实际外观。
2、Visualizing convnet filters
检查convnets学习的过滤器的另一个简单方法是显示每个过滤器要响应的可视模式。这可以通过输入空间中的梯度上升来实现:将梯度下降应用于convnet输入图像的值,以便从空白输入图像开始最大化特定过滤器的响应。所产生的输入图像将是所选滤波器最大响应的图像。这个过程很简单:我们将建立一个损失函数,使给定卷积层中给定滤波器的值最大化,然后我们将使用随机梯度下降来调整输入图像的值,从而使这个激活值最大化。例如,在VGG16网络的“block3_conv1”层中激活过滤器0时会丢失,在ImageNet上进行了预训练。
这些过滤器可视化告诉我们很多关于convnet层如何看待世界的信息:convnet中的每一层都只是学习一组过滤器,这样它们的输入就可以表示为过滤器的组合。这类似于傅立叶变换如何将信号分解成一组余弦函数。随着我们在模型中的提升,这些convnet过滤器组中的过滤器变得越来越复杂和精细:
1)模型中第一层的过滤器(block1_conv1)编码简单的方向性边和颜色(在某些情况下为彩色边)。
2)Block2_Conv1的过滤器对由边和颜色组合而成的简单纹理进行编码。
3)更高层的过滤器开始类似于自然图像中的纹理:羽毛、眼睛、树叶等。
3、Visualizing heatmaps of class activation
我们将介绍另一种可视化技术,这种技术有助于理解给定图像的哪些部分引导其进行最终的分类决策。这有助于“调试”回转网的决策过程,特别是在分类错误的情况下。它还允许我们在图像中查找特定对象。
这种一般类别的技术称为“类激活图”(CAM)可视化,并且包括在输入图像上产生“类激活”的热图。 “类激活”热图是与特定输出类相关联的分数的2D网格,针对任何输入图像中的每个位置计算,指示每个位置相对于所考虑的类的重要程度。例如,如果将图像输入我们的“猫与狗”之一,则类激活图可视化允许我们为类“猫”生成热图,指示图像中猫的不同部分是如何的,同样如此对于“狗”类,表示图像的狗状不同部分。
我们将使用的具体实现是Grad-CAM中描述的实现:你为什么这么说? 深度网络中基于梯度的本地化的可视化解释。 它非常简单:它包括在给定输入图像的情况下获取卷积层的输出特征图,并通过类相对于通道的梯度对该特征图中的每个通道进行加权。 直觉上,理解这一技巧的一种方法是,我们通过“每个通道对于类别的重要程度”来加权“输入图像激活不同通道的强度”的空间图,从而输入图像激活类的强烈程度”的空间图。
此可视化技术回答了两个重要问题:
1)为什么网络认为这个图像包含非洲象?
2)非洲大象在哪里?
特别值得注意的是,大象幼崽的耳朵被强烈激活:这可能是网络如何区分非洲和印度大象的区别。
本章总结
- convnets是解决视觉分类问题的最佳工具。
- convnets通过学习模块化模式和概念的层次结构来表示视觉世界。
- 他们学习的表示很容易检查-convnets与黑盒相反!
- 现在能够从头开始培训自己的convnet,以解决图像分类问题。
- 了解如何使用可视化数据增强来克服过度拟合。
- 知道如何使用预训练的convnet进行特征提取和微调。
- 可以生成convnets学习的过滤器的可视化,以及类活动的heatmap。