使用更高抽象层次的机器学习

我想知道如何让机器学习算法以更高的抽象层次进行思考——我似乎找不到任何相关资源。

假设我用一个包含1000个标记例子的数据集训练了一个机器学习算法来识别猫。如果我要识别狗,是否需要构建一个全新的算法并用1000个新的数据点进行训练,即使猫和狗有点相似?有没有一种方法可以将几张狗的图片(远少于1000张)输入到猫的算法中,现在它也能检测到狗?每次都要重新训练算法来做非常相似的事情似乎很繁琐(这是我到目前为止一直在做的)。

如果这个问题看起来很基础,很抱歉。我对机器学习很新(没有上过任何课程或相关内容);到目前为止,我只使用过非常简单的分类算法和基础的TensorFlow。


回答:

是的,实际上你要找的是迁移学习,这在深度学习和特别是图像识别中非常普遍。

迁移学习的工作原理(直观理解):

就你的例子而言,你有一个模型已经学会了非常好地识别猫。但为了让模型能够识别一张图片(注意:计算机将图片视为像素数组,仅此而已)是否是猫,它首先需要能够看到更简单的特征(例如线条、曲线、角、圆圈)。我们称这些为低层次特征。通过组合这些特征,模型现在可以学习如何看到高层次特征,或者更复杂的形状,可能特定于领域(例如眼睛、耳朵、爪子、尾巴)。现在这些高层次特征被传递给一个简单的分类器来告诉我们它是否是猫。

现在假设我们想要制作一个能够识别图片是否是狗的模型。通常我们必须从头开始训练,但我们真的需要这样做吗?实际上,不需要!我们可以利用从猫模型中学到的部分知识来简化我们的工作。结果证明,猫模型首先需要学习的这些低层次特征(线条、边缘等)几乎是通用的,可以在任何图像识别任务中使用!所以我们可以按原样使用这些低层次特征,调整高层次特征,并在最后完全训练分类器。因此,通过最小的训练,我们就有了一个能够学习识别狗的模型!

一旦你观察了这些特征,这个整个概念就会变得更加清晰:

在底部你可以看到可用于任何图像相关任务的通用低层次特征。然后每个模型从低层次特征中创建自己的高层次特征。这意味着,一旦一个模型学会了提取这些特征,这种知识就可以传递给另一个模型。

除了减少训练时间外,模型实际上还可以从初始模型所训练的更大训练集受益!因此,正如你所说,第二个模型可以用比第一个模型更少的图片进行训练!

在实践中如何做到这一点?

最简单的方法是先在第一个任务(在你的例子中是猫)上训练一个卷积神经网络,然后在第二个任务(狗)上用相同架构训练第二个网络。诀窍在于将第二个模型的权重初始化为第一个模型的权重。然后你可以选择可能冻结模型的前几层,因为这些层对应于模型已经学会提取的低层次特征。

这个过程实际上如此常见,以至于现在训练的大多数图像识别模型的权重都是从另一个预训练模型初始化的。

有例子吗?

我第一次看到这种方法是在Kaggle的猫狗对抗竞赛中,其中一个排名靠前的参赛者只是下载了在ImageNet数据集上预训练的模型权重,然后训练了大约5分钟(顺便说一下,这个过程通常被称为微调)。

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注