主要内容

基于深度网络设计器的迁移学习

这个例子展示了如何使用Deep Network Designer应用程序交互式地执行迁移学习。

迁移学习是采用预先训练好的深度学习网络并对其进行微调以学习新任务的过程。使用迁移学习通常比从头开始训练网络更快更容易。您可以使用更少的数据快速地将学习到的特征转移到新任务中。

使用Deep Network Designer进行图像分类的迁移学习,步骤如下:

  1. 打开深度网络设计器应用程序,选择一个预先训练好的网络。

  2. 导入新的数据集。

  3. 用适应新数据集的新层替换最后的层。

  4. 设置学习速率,使新层中的学习速度快于转移层。

  5. 使用Deep network Designer训练网络,或在命令行导出网络进行训练。

提取数据

在工作空间中,提取MathWorks Merch数据集。这是一个包含75张MathWorks商品图片的小数据集,属于五个不同的类别(多维数据集打牌螺丝刀,火炬).

解压缩(“MerchData.zip”);

选择一个预训练的网络

要打开深度网络设计器,请在应用程序选项卡,在机器学习和深度学习,点击应用程序图标。或者,你也可以从命令行打开应用程序:

deepNetworkDesigner

深度网络设计器提供了一系列预先训练的图像分类网络,这些网络已经学习了适用于广泛图像的丰富特征表示。如果你的图像与最初用于训练网络的图像相似,那么迁移学习效果最好。如果你的训练图像是像ImageNet数据库中那样的自然图像,那么任何预训练的网络都是合适的。有关可用网络的列表以及如何进行比较,请参见预训练的深度神经网络

如果您的数据与ImageNet数据非常不同——例如,如果您有微小的图像、光谱图或非图像数据训练,那么新的网络可能会更好。有关如何从头训练网络的示例,请参见使用深度网络设计器创建简单的序列分类网络而且在深度网络设计器中训练简单的语义分割网络

SqueezeNet不需要额外的支持包。金宝app对于其他预训练的网络,如果您没有安装所需的支持包,则应用程序提供金宝app安装选择。

选择SqueezeNet从预训练网络列表中,单击开放

探索网络

“深度网络设计器”中显示全网的缩小视图设计师窗格。

探索网络情节。要用鼠标放大,请使用Ctrl+滚轮。若要平移,请使用方向键,或按住滚轮并拖动鼠标。选择一个图层来查看它的属性。中查看网络摘要属性窗格。

导入数据

要将数据加载到深度网络设计器中,请在数据选项卡上,单击导入数据>导入镜像数据.弹出“导入镜像数据”对话框。

数据源列表中,选择文件夹.点击浏览并选择解压后的MerchData文件夹。

图像增强

您可以选择对训练数据应用图像增强。深度网络设计器应用程序提供以下增强选项:

  • x轴上的随机反射

  • y轴上的随机反射

  • 随机旋转

  • 随机重新调节

  • 随机水平平移

  • 随机垂直平移

通过对数据应用随机增强,可以有效地增加训练数据的数量。增强还使您能够训练网络,使其不受图像数据扭曲的影响。例如,您可以向输入图像添加随机旋转,以便网络对输入图像中旋转的存在是不变的。

对于这个示例,在x轴上应用一个随机反射,在[-90,90]度范围内随机旋转,以及在[1,2]范围内随机缩放。

验证数据

您还可以选择验证数据,方法是将其从训练数据中分离出来(称为拒绝验证),或者从其他来源导入。验证评估模型在新数据上与训练数据相比的性能,并帮助您监控性能并防止过拟合。

对于本例,使用30%的图像进行验证。

点击进口将数据导入Deep Network Designer。

可视化数据

使用深度网络设计器,您可以直观地检查训练和验证数据的分布数据选项卡。您可以看到,在本例中,数据集中有五个类。您还可以看到每个类的随机观察结果。

为培训准备网络

中编辑网络设计师窗格中指定数据中的新类数。为了准备网络进行迁移学习,替换最后的可学习层和最后的分类层。

替换最后一个可学习层

要使用预训练的网络进行迁移学习,必须改变类的数量以匹配新的数据集。首先,找到网络中最后一个可学习的层。对于SqueezeNet,最后一个可学习层是最后一个卷积层,“conv10”.在这种情况下,用一个新的卷积层替换卷积层,过滤器的数量等于类的数量。

拖动一个新的convolution2dLayer画在画布上。为了匹配原始的卷积层,设置FilterSize1, - 1

NumFilters属性定义分类问题的类数。改变NumFilters到新数据中的类数,在这个例子中,5

改变学习率,使学习在新层比在转移层更快通过设置WeightLearnRateFactor而且BiasLearnRateFactor10

删除最后一个2-D卷积层,连接你的新层。

替换输出层

对于迁移学习,需要替换输出层。滚动到末尾层的图书馆然后拖动一个新的classificationLayer画在画布上。删除原来的分类层,并在其位置连接新层。

对于新的输出层,不需要设置OutputSize.在训练时,Deep Network Designer自动从数据中设置层的输出类。

检查网络

单击,检查网络是否可以进行培训分析.如果深度学习网络分析仪报告零错误,那么编辑的网络已经准备好训练了。

列车网络的

在深度网络设计器中,您可以训练在应用程序中导入或创建的网络。

若要使用默认设置训练网络,请在培训选项卡上,单击火车.默认的训练选项更适合大数据集,对于小数据集减少迷你批量大小和验证频率。

如果您希望对培训进行更大的控制,请单击培训方案然后选择要训练的设置。

  • 将初始学习速率设置为较小的值,以降低迁移层的学习速度。

  • 指定验证频率,以便每个历元计算一次验证数据的准确性。

  • 指定少量的epoch。epoch是整个训练数据集上的一个完整的训练周期。对于迁移学习,您不需要训练那么多的周期。

  • 指定迷你批处理大小,即在每次迭代中使用多少图像。为了保证每个epoch都使用整个数据集,设置mini-batch size来平均分配训练样本的数量。

对于本例,设置InitialLearnRate0.0001ValidationFrequency5,MaxEpochs8.因为有55个观测值,所以设定MiniBatchSize11平均划分训练数据,确保在每个纪元使用整个训练数据集。有关选择培训选项的更多信息,请参见trainingOptions

单击,使用指定的训练选项对网络进行训练关闭然后点击火车

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

如需将训练图另存为图像,请单击出口培训地块

导出结果并生成MATLAB代码

导出具有训练权重的网络体系结构培训选项卡上,选择出口>输出训练过的网络和结果.深度网络设计器导出训练好的网络作为变量trainedNetwork_1训练信息作为变量trainInfoStruct_1

trainInfoStruct_1
trainInfoStruct_1 =带字段的结构:TrainingLoss:[3.1028 3.7235 3.5007 1.2493 1.5267 1.4770 1.2506 1.5767 1.0273 1.1279 0.6417 0.7218 0.7767 0.4651 0.7253 0.5403 0.5126 0.3012 0.6455 0.3397 0.604 0.3298 0.1844 0.2311 0.1427 0.1427 45.4545 36.3636 36.3636 36.3636 63.6364 36.3636 63.6364 81.8182 81.8182 72.7273 90.9091 81.8182 100 100 81.8182 100 100 100 100 100…]ValidationLoss:[3.4224 0.8457 1.6053南南南南南南南南南南南南南南南南南南南0.4317 0.4648 0.3389 0.4322 0.3652南南南南南南南南南南南南0.4720]ValidationAccuracy:[70 30南南南南南南南南南南南南南南南85 80年85年85年南南南南南南南南南南南南南南南南85 90]BaseLearnRate:[1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 e-04 e-04 e-04 e-04 e-04 e-04 e-04 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 e-04 e-04 e-04 e-04 e-04 e-04 e-04 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 e-04 e-04 e-04 e-04 e-04 e-04…]FinalValidationLoss: 0.4720 FinalValidationAccuracy: 90 OutputNetworkIteration: 40

您还可以生成MATLAB代码,它可以重新创建网络和使用的训练选项。在培训选项卡上,选择出口>生成培训代码.检查MATLAB代码,学习如何以编程方式准备训练数据,创建网络架构,并训练网络。

新图像分类

加载一个新的图像,使用训练好的网络进行分类。

I = imread(“MerchDataTest.jpg”);

深度网络设计器在训练过程中调整图像大小以匹配网络输入大小。若要查看网络输入大小,请转到设计师窗格,并选择imageInputLayer(第一层)。该网络的输入大小为227 * 227。

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

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

利用训练好的网络对测试图像进行分类。

[YPred,probs] = category (trainedNetwork_1,I);imshow(I) label = YPred;标题(string(标签)+”、“+ num2str(100*max(probs),3) +“%”);

另请参阅

相关的话题