本文介绍了基于KerasTensorflow抽象库的迁移学习算法模型。该算法简单,易于实现,取得了较好的效果。在机器学习和数据科学领域出现了许多被称为“深度学习”的方法。在所有这些“深度学习”方法中,有一个尤为突出,那就是学习表征的迁移。在迁移学习到的表示时,有一种方法特别简洁、健壮和有效。尤其是在计算机视觉领域,这种方式表现出了很大的优势,让以前无法完成的任务变得像keras.applicationsimport*一样简单。简而言之,这种方法规定应该使用大型数据集来学习将感兴趣的对象(例如图像、时间序列、客户甚至网络)表示为适合数据科学研究任务的特征向量,例如作为分类或聚类。一旦学会,表示机制就可以被其他研究人员或其他数据集使用,而无需考虑新数据的数据量或可用计算资源的大小。在本文中,我们使用kerasTensorFlow抽象库演示了基于预训练计算机视觉模型的迁移学习的使用。预训练的计算机视觉模型已经在大型ImageNet数据集上进行了训练,并学会了以特征向量的形式生成图像的简单表示。在这里,我们将使用这种机制来学习鸟类分类器。有很多方法可以使用预训练模型,选择哪种通常取决于数据集的大小和可用的计算资源,这些方法包括:微调(Finetuning):在这种情况下,将softmax层替换为一个适当的大小使最终的分类层适应当前数据集,而所有其他层的学习参数保持不变,然后在新任务上进行进一步的训练。冻结:微调的方法需要比较强的计算能力和大量的数据。对于较小的数据集,“冻结”网络的一些第一层是很常见的,这意味着预训练网络的参数在这些层中是固定的。其他层像以前一样接受新任务的训练。特征提取:这种方法是预训练网络最宽松的用法。图像通过网络前馈,并使用特定层(通常是最终分类器输出之前的层)作为表示,永远不会为新任务重新训练。这种图像-矢量机制的输出几乎可以用于任何后续任务。在本文中,我们将使用特征提取方法。首先,我们使用一个单一的预训练深度学习模型,然后使用堆叠技术组合四个不同的模型。然后对CUB-200数据集进行分类,该数据集(由vision.caltech提供)包括200张所选鸟类的图像。首先,下载数据集,MAC/Linux系统下载路径:或者,直接下载并手动解压文件。下面介绍程序中的主要元素。我们省略了导入和部署代码以支持更具可读性的文本,如果需要请查看完整代码。让我们从使用实用函数(此处)加载数据集开始,该函数使用指定大小的图像加载数据集。“CUB_200_2011”文件夹是数据集解压时创建的,常量CUB_DIR指向该文件夹下的“image”目录。首先,我们将使用Resnet50模型(参见论文和keras文档)进行特征提取。请注意,我们使用的是244x244像素大小的图像。要生成整个数据集的向量表示,需要添加以下两行代码:创建模型时,使用preprocess_input函数对初始训练数据(ImageNet)进行归一化,即减去均值通道的结果像素值。ResNet50.predict进行实际的转换,返回代表每个图像的大小为2048的向量。调用时,ResNet501d[1]的构造函数会下载预训练的参数文件,所需时间取决于您的网速。之后,这些特征向量与简单的线性SVM分类器一起用于交叉验证过程。[0.625221580.623445830.62852745]总体精度:62.6通过这种简单的方法,我们在200类数据集上实现了62.6%的精度。在接下来的部分中,我们将继续使用几个预训练模型和堆叠方法来完善这个结果。在任何情况下,使用多个预训练模型都与使用单个特征集感觉相同:它们希望提供一些不重叠的信息,以便它们在组合时表现更好。我们将使用的方法来自这四种预训练模型(VGG19、ResNet、Inception和Xception)的特征,统称为“stacking”。Stacking是一种两阶段算法,其中一组模型(基础分类器)的预测被聚合并馈送到第二阶段预测器(元分类器)。在这个例子中,每个基础分类器都是一个简单的逻辑回归模型。然后将这些输出概率取平均并输入线性SVM算法以提供最终决策。每个预训练模型(如上面的ResNet)都可以生成一个特征集(X_vgg、X_resnet、X_incept、X_xcept),我们从这个开始(完整代码见gitrepo)。为方便起见,所有特征集都堆叠到一个矩阵中,但保留了边界索引,以便每个模型都可以指向正确的集合。我们将使用强大的mlxtend扩展库来简化堆叠算法。对于四个基本分类器中的任何一个,我们构建一个传递,选择适当的特征并遵循LogisticRegression算法的路径。定义并配置堆叠分类器,以使用每个基分类器提供的平均概率作为聚合函数。***,我们要测试stacking的方法:[0.742213220.741943670.75115444]Overallaccuracy:74.5提供一些model-basedclassifiers,并使用这些单独预训练分类器的stacking方法,我们得到74.5%的准确度,这与单一的ResNet模型相比有了很大的提升(可以用同样的方法测试其他模型来比较这两种方法)。总之,本文描述了利用多个预训练模型作为特征提取机制,并使用堆叠算法将它们组合起来进行图像分类的方法。这种方法简单、易于实施,并且产生几乎出人意料的好结果。[1]深度学习模型通常在GPU上进行训练。如果你使用的是低端笔记本GPU,它可能不适合运行我们这里使用的一些机型,因为它会导致内存溢出异常。如果是这样,那么你应该强制TensorFlow在CPU上运行所有内容,将所有与深度学习相关的东西放在一个块下tf.device("/cpu:0"):。
