在本教程中,您将学习如何为图像分类任务进行转移学习。 Keras的高级API使超级简单,只需几个简单的步骤。
转移学习使我们能够使用少得多的数据来训练深度网络,而如果我们从头开始训练的话,我们将需要它。 通过转移学习,我们实际上是在将模型从先前任务中学到的“知识”转移到我们当前的任务。 这个想法是,这两个任务不是完全脱节的,因此,我们可以利用模型通过广泛的培训中学到的任何网络参数,而不必自己进行培训。
传递学习已得到一致证明,可以提高模型的准确性并减少所需的培训时间。 数据更少,时间更少,准确性更高。
加载东西
我们要做的第一件事是准备我们的数据。 对于Keras中的图像分类,最简单的方法是将数据分类到每个类的文件夹中。 例如,如果您的数据集具有3类:Pizza,Burger和Taco,则您应具有3个文件夹,分别称为Pizza,Burger和Taco。 您的每个文件夹都应包含该特定类的图像。 您的文件夹结构应如下所示:
接下来,我们可以选择要对其进行转移学习的模型。 Keras为此提供了许多选择。在做出选择时,您可以粗略地相信(出于此处的目的),较小的模型(以MB为单位)将更快但精度较低,而较大的模型将较慢但更准确。截至今天为止,MobileNet是最快的,而NASNetLarge是最准确的。今天,我们将选择处于中间位置的ResNet50模型。
查看下面的代码。我们首先导入必要的模型和预处理功能。 ResNet50模型经过了非常特殊的预处理训练,我们将希望对其进行重新使用以对其进行适当的训练。注意,当我们初始化基本模型时,如何设置include_top = False。此设置很重要,因为这意味着我们不会在模型的末尾保留全连接(FC)层。这正是我们想要的,因为我们将训练我们自己的全新FC层进行迁移学习。
流动数据
现在,我们需要创建一个数据生成器,以实际方式自动从文件夹中获取数据并进入Keras。 Keras为此提供了方便的python生成器功能。
我们定义我们的训练目录“ food_dataset”,其中包含我们之前设置的每个图像类别的文件夹。 我们还定义了图像尺寸和批量大小。 Keras生成器将使用双线性插值自动将所有加载的图像调整为target_size的大小。 我们将在生成器中添加一些额外的数据增强功能(翻转和旋转),以尝试提高模型的准确性。 我们使用flow_from_directory函数创建最终生成器,该函数将使用队列来保持连续的加载和准备图像流!
弹出层
现在是时候为过渡学习建立我们的最终模型了。如果将来要再次使用它,可能会发现为它编写函数非常方便。您可以从下面开始。
首先冻结所有基本模型的图层。我们不想训练这些层,因为我们试图利用网络从以前的数据集(在本例中为ImageNet)中学到的知识。通过设置layer.trainable = False,我们告诉Keras在训练期间不要更新这些权重,这正是我们想要的!
现在,我们可以添加FC层。由于许多网络具有多个FC层,因此我们循环执行此操作,并且遍历列表使事情变得简单明了。我们还将在每个FC层中添加一些删除项,以减少过度拟合的机会(此部分是可选的)。最后,我们添加最后的Softmax层并构建Keras模型。
一旦我们的功能全部设置好,创建最终模型就很简单。只需传递softmax层的类数,列表中FC层的大小(因为我们对其进行循环)以及丢失概率。
训练
最后一步是设置我们的培训,然后单击红色的大按钮使其全部运行!
我们将使用亚当优化器,将其学习率值设置为较小的值。 我们选择Adam是因为它相对于SGD而言超级易用。 我们将学习率设置为较小,因为我们仅在这里微调模型,尤其是FC层; 我们不希望进行任何重大更改,而只是进行调整。
我们还将设置一些检查点以保存权重以供以后使用。 应用fit_generator函数可运行整个训练方案,并带有可选的时期数,批处理大小和数据改组。 训练完成后,我们可以使用历史记录输出训练结果。 瞧,转学!
喜欢学习吗?
在Twitter上关注我,在其中发布有关最新,最出色的AI,技术和科学的所有信息! 也在LinkedIn上与我联系!
推荐读物
想更多地了解深度学习? 《使用Python进行深度学习》这本书将教您如何使用有史以来最简单的Python库进行真正的深度学习:Keras!
本文编译自 | towardsdatascience.com 译者 | Yafei
本文采用「CC BY-SA 4.0 CN」协议转载自互联网、仅供学习交流,内容版权归原作者所有,如涉作品、版权和其他问题请给「我们」留言处理。