主要内容

使用深度网络设计师进行迁移学习

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

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

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

  1. 打开Deep Network Designer应用程序,选择一个预先训练的网络。

  2. 导入新的数据集。

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

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

  5. 使用深层网络设计器培训网络,或在命令行导出网络进行培训。

提取数据

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

解压缩(“MerchData.zip”);

选择预训练网络

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

deepNetworkDesigner

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

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

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

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

探索网络

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

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

导入数据

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

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

图像增强

您可以选择对训练数据应用图像增强。Deep Network Designer应用程序提供以下增强选项:

  • x轴上的随机反射

  • y轴上的随机反射

  • 随机旋转

  • 随机重新调节

  • 随机水平翻译

  • 随机垂直翻译

通过对数据应用随机增强,可以有效地增加训练数据的数量。增强还使您能够训练网络以对图像数据的畸变保持不变。例如,可以向输入图像添加随机旋转,这样网络就不会因输入图像的旋转而改变。

对于本例,在x轴上应用随机反射,从[-90,90]度范围随机旋转,从[1,2]范围随机缩放。

验证数据

您还可以选择从训练数据中分离验证数据,或者从其他来源导入验证数据。验证将评估新数据与训练数据相比的模型性能,并帮助您监控性能和防止过拟合。

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

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

可视化数据

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

准备培训网络

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

替换最后一个可学习层

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

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

NumFilters属性定义用于分类问题的类的数量。改变NumFilters更改为新数据中的类数,在本例中,5

通过设置改变学习速率,使新层的学习速度比转移层的学习速度快WeightLearnRateFactorBiasLearnRateFactor10

删除最后一个2d卷积层,并连接你的新层代替。

替换输出层

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

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

检查网络

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

列车网络的

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

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

如果您想对培训有更大的控制,请单击培训方案选择训练的环境。

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

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

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

  • 指定小批量大小,即在每个迭代中使用多少图像。为了确保在每个epoch使用整个数据集,设置小批量大小均匀地除以训练样本的数量。

对于本例,setInitialLearnRate0.0001ValidationFrequency5,MaxEpochs8.因为有55个观察结果,设定MiniBatchSize11平均划分训练数据,确保在每个epoch使用整个训练数据集。有关选择培训选项的更多信息,请参见trainingOptions

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

深度网络设计器允许您可视化和监控培训进度。如果需要,您可以编辑培训选项并对网络进行再培训。

导出结果并生成MATLAB代码

以输出网络架构与训练的权重,上培训选项卡上,选择出口>输出训练有素的网络和结果.深度网络设计器输出训练有素的网络作为变量trainedNetwork_1训练信息作为变量trainInfoStruct_1

trainInfoStruct_1
trainInfoStruct_1 =结构体字段:TrainingLoss:[4.2191 3.1255 2.6411 2.3362 3.1848 2.0195 1.2013 0.9902 1.8173 1.4625 0.8134 1.1901 0.8047 1.0542 0.7252 0.5411 0.5809 0.6819 0.4660 0.6830 0.7275 0.7365 0.4214 0.6107 0.2119 0.3021 0.3226 0.5457 0.1718 0.2522 0.1445…][0 18.1818 9.0909 27.2727 45.4545 63.6364 36.3636 45.4545 63.6364 36.3636 63.6364 45.4545 63.6364 81.8182 81.8182 81.8182 81.8182 81.8182 81.8182 81.8182 81.8182 81.8182 81.8182 100 72.7273 100 100 90.9091 72.7273 100 100 100 100…][3.6204楠楠楠2.4244楠楠楠1.7002楠楠楠1.0075楠楠楠0.7250楠楠楠0.5500楠楠楠0.4534楠楠楠0.4074楠楠楠0.3854]验证精度:[10.0000 NaN NaN NaN 30 NaN NaN NaN NaN 50 NaN NaN NaN NaN NaN 70 NaN NaN NaN NaN NaN NaN 80.0000 NaN NaN NaN NaN NaN NaN NaN NaN 80.0000 NaN NaN NaN NaN NaN NaN NaN 90 NaN NaN NaN NaN NaN NaN NaN 95 NaN NaN NaN NaN 95][1.0000e-04 1.0000e-04 1.0000e-04 1.0000e-04 1.0000e-04 1.0000e-04 1.0000e-04 1.0000e-04 1.0000e-04 1.0000e-04 1.0000e-04 1.0000e-04 1.0000e-04 1.0000e-04 1.0000e-04 1.0000e-04 1.0000e-04 1.0000e-04 1.0000e-04 1.0000e-04 1.0000e-04 1.0000e-04 1.0000e-04 1.0000e-04 1.0000e-04 1.0000e-04 1.0000e-04 1.0000e-04 1.0000e-04 1.0000e-04 1.0000e-04 1.0000e-04 1.0000e-04 1.0000e-04 1.0000e-04 1.0000e-04 1.0000e-04 1.0000e-04 1.0000e-04 1.0000e-04 1.0000e-04 1.0000e-04 1.0000e-04 1.0000e-04

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

分类新形象

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

我= imread (“MerchDataTest.jpg”);

深度网络设计器在训练期间调整图像的大小,以匹配网络输入的大小。如果需要查看网络输入大小,请进入设计师窗格,并选择imageInputLayer(第一层)。这个网络的输入尺寸是227乘227。

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

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

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

(YPred,聚合氯化铝)= (trainedNetwork_1, I)进行分类;imshow(I) label = YPred;标题(string(标签)+”、“+ num2str(100 *马克斯(聚合氯化铝),3)+“%”);

另请参阅

相关的话题