Main Content

本页翻译不是最新的。点击此处可查看最新英文版本。

迁移学习快速入门

此示例说明如何使用迁移学习来重新训练 SqueezeNet(一种预训练卷积神经网络)以对新图像集进行分类。尝试此示例以了解在 MATLAB® 中进行深度学习有多么简单。

有关示例的可视化演示,请观看视频。

深度学习应用中常常用到迁移学习。您可以采用预训练的网络,基于它学习新任务。与使用随机初始化的权重从头训练网络相比,通过迁移学习微调网络要更快更简单。您可以使用较少数量的训练图像快速地将已学习的特征迁移到新任务。

提取数据

在工作区中,提取 MathWorks Merch 数据集。这是包含 75 幅 MathWorks 商品图像的小型数据集,这些商品分属五个不同类(瓶盖魔方扑克牌螺丝刀手电筒)。

unzip("MerchData.zip");

加载预训练网络

打开深度网络设计器。

deepNetworkDesigner

从预训练网络列表中选择 SqueezeNet,然后点击打开

深度网络设计器将显示整个网络的缩小视图。

浏览网络图。要使用鼠标放大,请使用 Ctrl + 滚轮。要平移,请使用箭头键,或按住滚轮并拖动鼠标。选择一个层以查看其属性。取消选择所有层,以在属性窗格中查看网络摘要。

导入数据

要将数据加载到深度网络设计器中,请在数据选项卡上,点击导入数据 > 导入图像分类数据

数据源列表中,选择文件夹。点击浏览并选择提取的 MerchData 文件夹。

将数据分为 70% 用作训练数据,30% 用作验证数据。

指定要对训练图像执行的增强操作。数据增强有助于防止网络过拟合和记忆训练图像的具体细节。对于此示例,在 x 轴上进行随机翻转,在 [-90,90] 度范围内进行随机旋转,在 [1,2] 范围内进行随机重新缩放。

点击导入将数据导入深度网络设计器。

编辑迁移学习网络

要重新训练 SqueezeNet 以对新图像进行分类,请编辑网络的最后一个二维卷积层和最终分类层。在 SqueezeNet 中,这两个层的名称分别为 'conv10''ClassificationLayer_predictions'

设计器窗格中,选择 'conv10' 层。在属性窗格的底部,点击解锁层。在出现的警告对话框中,点击仍要解锁。这将解锁层属性,以便您可以使其适应新任务。

在 R2023b 之前:要编辑层属性,您必须替换层,而不是解锁层。在新的卷积二维层中,将 FilterSize 设置为 [1 1]。

NumFilters 属性设置为新的类数,在此示例中为 5

通过将 WeightLearnRateFactorBiasLearnRateFactor 设置为 10 来更改学习率,使新层中的学习速度快于迁移层的学习速度。

配置输出层。选择分类层 ClassificationLayer_predictions,点击解锁层,然后点击仍要解锁。对于解锁的输出层,不需要设置 OutputSize。在训练时,深度网络设计器会根据数据自动设置层的输出类。

训练网络

要选择训练选项,请选择训练选项卡,然后点击训练选项。将初始学习率设置为较小的值以减慢迁移的层中的学习速度。在上一步中,您增大了二维卷积层的学习率因子,以加快新的最终层中的学习速度。这种学习率设置组合只会加快新层中的学习速度,对于其他层则会减慢学习速度。

对于此示例,将 InitialLearnRate 设置为 0.0001MaxEpochs 设置为 8ValidationFrequency 设置为 5。由于有 55 个观测值,因此将 MiniBatchSize 设置为 11 以平均划分训练数据,并确保在每轮期间使用整个训练集。

要使用指定的训练选项训练网络,请点击确定,然后点击训练

深度网络设计器允许您可视化和监控训练进度。然后,如果需要,您可以编辑训练选项并重新训练网络。

导出结果并生成 MATLAB 代码

要导出训练结果,请在训练选项卡上选择导出 > 导出经过训练的网络和结果。深度网络设计器将经过训练的网络导出为变量 trainedNetwork_1,将训练信息导出为变量 trainInfoStruct_1

您也可以生成 MATLAB 代码,它可以重新创建所使用的网络和训练选项。在训练选项卡上,选择导出 > 生成训练代码。查看 MATLAB 代码,了解如何以编程方式准备训练数据、创建网络架构和训练网络。

对新图像进行分类

加载一个新图像以使用经过训练的网络对其进行分类。

I = imread("MerchDataTest.jpg");

调整测试图像的大小以匹配网络输入大小。

I = imresize(I, [227 227]);

使用经过训练的网络对测试图像进行分类。

[YPred,probs] = classify(trainedNetwork_1,I);
imshow(I)
label = YPred;
title(string(label) + ", " + num2str(100*max(probs),3) + "%");

参考

[1] ImageNet. http://www.image-net.org

[2] Iandola, Forrest N., Song Han, Matthew W. Moskewicz, Khalid Ashraf, William J. Dally, and Kurt Keutzer. "SqueezeNet: AlexNet-level accuracy with 50x fewer parameters and <0.5 MB model size." Preprint, submitted November 4, 2016. https://arxiv.org/abs/1602.07360.

[3] Iandola, Forrest N. "SqueezeNet." https://github.com/forresti/SqueezeNet.

另请参阅

| | |

相关主题