主要内容

挤压网

挤压网络卷积神经网络

  • 挤压网网络结构

描述

Screezenet是一个卷积神经网络,是18层。您可以从ImageNet数据库中加载培训的网络培训的预磨损版本[1].佩带的网络可以将图像分为1000个对象类别,例如键盘,鼠标,铅笔和许多动物。因此,该网络已经学习了丰富的图像的丰富特征表示。该函数返回一个Squeezenet V1.1网络,其对Screezenet V1.0具有类似的准确性,但需要每个预测的浮点操作较少[3].该网络的图像输入尺寸为227 × 227。用于MATLAB中更多的预训练网络®,请参阅预先训练的深度神经网络

您可以使用分类使用SqueezeNet网络对新图像进行分类。有关示例,请参阅使用scriezenet对图像进行分类

您可以重新启动SqueezEnet网络以使用传输学习执行新任务。例如,看到使用SCREEZENET进行互动转移学习

例子

=挤压返回在ImageNet数据集上训练的SqueezeNet网络。

= squeezenet(“权重”,“imagenet”返回在ImageNet数据集上训练的SqueezeNet网络。该语法等价于网= squeezenet

LGRAPH.= squeezenet(“权重”,“没有”返回未经训练的SqueezeNet网络架构。

例子

全部崩溃

加载一个预先训练过的SqueezeNet网络。

网= squeezenet
net=DAG网络,具有以下属性:层:[68×1 nnet.cnn.layer.layer]连接:[75×2表]

这个函数返回DAGNetwork对象。

深度学习工具箱™中包含了SqueezeNet。要加载其他网络,请使用如下函数水壶从Add-On Explorer获取下载预先训练过的网络的链接。

此示例演示如何微调预训练的挤压网络,以对新图像集合进行分类。此过程称为转移学习,通常比训练新网络快得多,也容易得多,因为您可以使用较少的训练图像将学习到的功能应用于新任务。要准备网络进行转移学习,请执行以下操作:使用Deep Network Designer以交互方式进行rning。

提取数据

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

解压缩(“MerchData.zip”);

在深网络设计师中打开挤压

打开带挤压的深网络设计师。

deepNetworkDesigner (squeezenet);

Deep Network Designer在中显示整个网络的缩小视图设计师窗格。

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

导入数据

要将数据加载到Deep Network Designer,请在数据选项卡上,单击导入数据>导入图像数据.打开“导入图像数据”对话框。

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

将数据分为70%的培训数据和30%的验证数据。

指定要在训练图像上执行的增强操作。对于本例,在x轴上应用随机反射,从[-90,90]度范围随机旋转,从[1,2]范围随机缩放。数据增强有助于防止网络过度拟合和记忆训练图像的确切细节。

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

可视化数据

使用Deep Network Designer,您可以在数据选项卡。您还可以查看随机观察结果及其标签,作为训练前的简单检查。您可以看到,在这个示例中,数据集中有5个类。

编辑传输学习网络

网络的卷积层提取图像特征,最后一个可学习层和最后一个分类层用来对输入图像进行分类。这两个层,“conv10”“分类层预测”在SqueezeNet中,包含了如何将网络提取的特征组合成类别概率、损失值和预测标签的信息。为了重新训练一个预先训练的网络来分类新的图像,将这两层替换为适应新数据集的新层。

在大多数网络中,具有可学习权值的最后一层是完全连接层。在一些网络中,如SqueezeNet,最后的可学习层是最后的卷积层。在这种情况下,将卷积层替换为一个新的卷积层,该卷积层的过滤器数量等于类的数量。

设计师窗格中,拖动一个新的convolution2dLayer到画布上。为了匹配原始卷积层,设置FilterSize1,1改变NumFilters在新数据中的类数,在此示例中,5

通过设置更改学习速率,使新层中的学习速度快于传输层中的学习速度举重双线性学习因子10。删除最后一个二维卷积层,然后连接新层。

替换输出层。滚动到输出层的末尾图书馆库并拖动一个新的分类层在画布上。删除原始输出层并连接新层。

检查网络

要确保编辑的网络已准备好接受培训,请单击分析,并确保深度学习网络分析器报告零错误。

列车网络的

指定培训选项。选择训练标签并单击培训方案

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

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

  • 指定少数时期。epoch是整个培训数据集的完整培训周期。对于转移学习,您不需要为尽可能多的时代培训。

  • 指定最小批量大小,即在每次迭代中使用多少个图像。为确保在每个历元期间使用整个数据集,请将最小批量大小设置为平均分配训练样本数。

对于此示例,设置初始学习率0.0001.验证频繁5,最大时代8.由于有55个观测值,设置小批量11

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

Deep Network Designer允许您可视化和监视培训进度。然后,如果需要,您可以编辑培训选项并重新培训网络。

导出结果并生成MATLAB代码

要导出具有训练权重的网络体系结构,请在训练选项卡,选择出口>出口培训网络和成果. Deep Network Designer将经过训练的网络导出为变量培训网络1以培训信息作为变量trainInfoStruct_1

trainInfoStruct_1
trainInfoStruct_1 =带字段的结构:培训损失:[1×40双倍]培训准确性:[1×40双倍]验证损失:[3.3420楠楠2.1187楠楠1.4291楠楠0.8527楠楠0.5849楠楠0.4678楠楠0.3967楠楠0.3875楠楠0.3749]验证准确性:[20楠楠楠30楠楠楠楠55.0000楠楠楠65楠楠楠楠楠85楠楠楠楠95楠楠楠楠楠95]基准利率:[1×40双倍]最终验证损失:0.3749最终验证准确率:95

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

分类新镜头

加载新图像以使用训练过的网络进行分类。

I=imread(“merchdattest.jpg”);

深度网络设计器在训练期间调整图像的大小,以匹配网络输入的大小。如果需要查看网络输入大小,请进入设计师窗格,并选择imageInputlayer.(第一层)。该网络的输入大小为227×227。

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

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

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

[YPred,probs]=分类(训练网络_1,I);imshow(I)标签=YPred;标题(字符串(标签)+", "+num2str(最大值为100*3)+“%”);

这个例子展示了如何微调一个预先训练的SqueezeNet卷积神经网络来对一组新的图像进行分类。

Screezenet已培训超过一百万只图像,可以将图像分为1000个对象类别(例如键盘,咖啡杯,铅笔和许多动物)。该网络已经学习了丰富的特征表示,以获得各种图像。该网络将图像作为输入,将图像中的对象的标签与每个对象类别的概率一起输出。

转移学习通常用于深入学习应用。您可以拍摄备用网络并将其用作学习新任务的起点。微调具有传输学习的网络通常比训练网络从头开始随机初始化的权重更快更容易。您可以使用较少数量的培训图像快速将学习功能转移到新任务。

加载数据

将新图像解压并作为图像数据存储加载。imageDatastore根据文件夹名称自动标记图像,并将数据存储为ImageDatastore对象。图像数据存储使您能够存储大型图像数据,包括内存中不适合的数据,并在卷积神经网络训练期间高效地读取图像批次。

解压缩(“MerchData.zip”);imd = imageDatastore (“MerchData”......“IncludeSubfolders”,真的,......“LabelSource”'foldernames');

将数据分为训练数据集和验证数据集。使用70%的图像进行训练,30%的图像进行验证。拆分标签分裂图像数据存储到两个新数据存储。

[imdsTrain,imdsValidation]=拆分每个标签(imds,0.7,“随机”);

这个非常小的数据集现在包含55个训练图像和20个验证图像。显示一些示例图像。

numTrainImages =元素个数(imdsTrain.Labels);idx = randperm (numTrainImages 16);我= imtile (imd,“帧”,idx);图1(I)

图中包含一个轴对象。axis对象包含一个image类型的对象。

负载Pretrained网络

加载预训练的挤压网络神经网络。

网= squeezenet;

使用分析网络显示网络架构的交互式可视化和有关网络层的详细信息。

analyzeNetwork(净)

第一层,图像输入层需要输入尺寸227-×227-×3的输入图像,其中3是颜色信道的数量。

inputSize=net.Layers(1).inputSize
inputSize =1×3.227 227 3.

取代最后一层

网络的卷积层提取图像特征,最后一个可学习层和最后一个分类层用来对输入图像进行分类。这两个层,“conv10”“分类层预测”在SqueezeNet中,包含了如何将网络提取的特征组合成类别概率、损失值和预测标签的信息。为了重新训练一个预先训练的网络来分类新的图像,将这两层替换为适应新数据集的新层。

从训练的网络中提取层图。

lgraph=层图(净);

找到要替换的两层的名称。您可以手动执行此操作,也可以使用支持功能金宝appfindlayerstoreplace自动查找这些层。

[learnableLayer,classLayer]=findlayerstorereplace(lgraph);[learnableLayer,classLayer]
ans = 1x2 Layer array with layers: 1 'conv10' Convolution 1000 1x1x512卷积与stride[1 1]和填充[0 00]2 'ClassificationLayer_predictions'分类输出crossentropyex与'tench'和999其他类

在大多数网络中,具有可学习权值的最后一层是完全连接层。在一些网络中,比如SqueezeNet,最后的可学习层是一个1乘1的卷积层。在这种情况下,将卷积层替换为一个新的卷积层,该卷积层的过滤器数量等于类的数量。要想在新的层次上比在转移的层次上学得更快,就要增加举重双线性学习因子卷积层的值。

numClasses=numel(类别(imdsTrain.Labels))
numClasses = 5
newConvLayer = convolution2dLayer([1,1],numClasses,“权重学习速率因子”10,'biaslearnratefactor'10,“名称”“新康”);lgraph=替换层(lgraph,“conv10”,newconvlayer);

分类层指定网络的输出类。用不带类标签的新分类层替换分类层。列车网络在训练时自动设置图层的输出类。

newClassificatonLayer = classificationLayer (“名字”'new_classoutpul');lgraph=替换层(lgraph,“分类层预测”,newclassificatonlayer);

列车网络的

网络需要大小为227 × 227 × 3的输入图像,但图像数据存储中的图像大小不同。使用扩充图像数据存储来自动调整训练图像的大小。指定要对训练图像执行的附加增强操作:沿着垂直轴随机翻转训练图像,并随机将它们水平和垂直平移至30像素。数据增强有助于防止网络过度拟合和记忆训练图像的确切细节。

pixelRange = [-30 30];imageAugmenter = imageDataAugmenter (......“RandXReflection”,真的,......“随机翻译”,pixelrange,......“兰迪翻译”,pixelRange);augimdsTrain=增强的图像数据存储(inputSize(1:2),imdsTrain,......“DataAugmentation”图像增强仪);

要在不执行进一步数据扩充的情况下自动调整验证图像的大小,请使用扩充图像数据存储,而不指定任何其他预处理操作。

augimdsvalidation = augmentedimagedataStore(输入(1:2),IMDSValidation);

指定培训选项。对于转移学习,保留来自预训练网络早期层的特征(转移层权重)。要减缓转移层中的学习速度,请将初始学习速率设置为较小的值。在上一步中,您增加了卷积层的学习速率因子,以加快新的最终层中的学习。这种学习速率设置的组合只会导致新层的快速学习和其他层的慢速学习。在执行迁移学习时,您不需要进行尽可能多的历次训练。历元是整个训练数据集上的完整训练周期。指定小批量大小为11,以便在每个时间段中考虑所有数据。该软件每隔一天对网络进行验证验证频繁训练期间的迭代。

选择= trainingOptions (“sgdm”......'minibatchsize',11,......“MaxEpochs”7......“初始学习率”2的军医,......“洗牌”“every-epoch”......“ValidationData”,augimdsValidation,......“ValidationFrequency”3.......“冗长”假的,......“阴谋”'培训 - 进步');

培训由转移和新层组成的网络。默认情况下,列车网络如果GPU可用,则使用GPU。这需要并行计算工具箱™ 和支持的GPU设备。有关支持的设备的信息,请参阅金宝appGPU版金宝app本支持(并行计算工具箱).否则,列车网络使用一个CPU。属性也可以指定执行环境“ExecutionEnvironment”的名称-值对参数trainingOptions

Nettransfer = Trainnetwork(Augimdstrain,Lgraph,选项);

Figure Training Progress(01-Sep-2021 08:25:12)包含2个轴对象和另一个uigridlayout类型的对象。轴对象1包含14个patch、text、line类型的对象。轴对象2包含14个patch、text、line类型的对象。

对验证图像进行分类

使用微调网络对验证图像进行分类。

[YPred,得分]=分类(净转移,augimdsValidation);

显示四个样本验证图像与他们的预测标签。

idx = randperm(元素个数(imdsValidation.Files), 4);数字对于i = 1:4 subplot(2,2,i) i = readimage(imdsValidation,idx(i));imshow(I) label = YPred(idx(I));标题(字符串(标签));终止

图中包含4个轴对象。标题为MathWorks扑克牌的轴对象1包含图像类型的对象。标题为MathWorks扑克牌的轴对象2包含图像类型的对象。标题为MathWorks立方体的轴对象3包含图像类型的对象。标题为MathWorks立方体的轴对象4包含图像类型的对象。

计算验证集上的分类精度。准确率是网络正确预测标签的比例。

YValidation=imdsValidation.Labels;精度=平均值(YPred==YValidation)
精度=1

有关提高分类准确性的提示,请参阅深入学习技巧

使用挤压网读取、调整图像大小并对图像进行分类。

首先,加载预训练的挤压网模型。

网= squeezenet;

使用以下命令读取图像imread

I=imread(“peppers.png”);图1(I)

图中包含一个轴对象。axis对象包含一个image类型的对象。

预训练模型要求图像大小与网络的输入大小相同。使用InputSize网络第一层的属性。

sz = net.layers(1).InputSize
深圳=1×3.227 227 3.

将图像调整为网络的输入大小。

I = imresize(我,深圳(1:2));图imshow(我)

图中包含一个轴对象。axis对象包含一个image类型的对象。

使用图像分类分类

标签=分类(网络,i)
标签=明确的甜椒

将图像和分类显示在一起。

图imshow(I)标题(标签)

图中包含一个轴对象。带有标题喇叭口的轴对象包含类型图像的对象。

这个例子展示了如何从预先训练的卷积神经网络中提取学习到的图像特征,并使用这些特征来训练图像分类器。特征提取是利用预先训练的深度网络的表征能力的最简单和最快的方法。例如,您可以使用以下方法训练支持向量机(SVM)金宝appfitcecoc(统计和机器学习工具箱™)上提取的功能。因为特征提取只需要一个通过数据,所以如果您没有GPU以加速网络培训,则是一个很好的起点。

加载数据

解压缩并将样本图像加载为图像数据存储。imageDatastore根据文件夹名称自动标记图像,并将数据存储为ImageDatastore对象图像数据存储允许您存储大型图像数据,包括内存中不适合的数据。将数据分为70%的培训数据和30%的测试数据。

解压缩(“MerchData.zip”);imd = imageDatastore (“MerchData”......“IncludeSubfolders”,真的,......“LabelSource”'foldernames'); [imdsTrain,imdsTest]=拆分每个标签(imds,0.7,“随机”);

这个非常小的数据集现在有55张训练图像和20张验证图像。显示一些示例图像。

numImagesTrain =元素个数(imdsTrain.Labels);idx = randperm (numImagesTrain 16);我= imtile (imd,“帧”,idx);图1(I)

图中包含一个轴对象。axis对象包含一个image类型的对象。

负载Pretrained网络

加载一个预先训练过的SqueezeNet网络。SqueezeNet可以训练100多万幅图像,并可以将图像分为1000个对象类别,例如,键盘、鼠标、铅笔和许多动物。因此,该模型学习了丰富的特征表示范围广泛的图像。

网= squeezenet;

分析网络体系结构。

analyzeNetwork(净)

第一层,图像输入层需要输入尺寸227-×227-×3的输入图像,其中3是颜色信道的数量。

inputSize=net.Layers(1).inputSize
inputSize =1×3.227 227 3.

提取图像特征

该网络构建了输入图像的层次表示。更深层次包含更高层次的特性,这些特性是使用较早层次的较低层次特性构造的。要获得训练和测试图像的特征表示,使用激活关于全局平均池层“pool10”。要获得图像的较低级别表示,请使用网络中较早的层。

网络需要大小为227-x-227-x-3的输入图像,但图像数据存储中的图像大小不同。若要在将培训和测试图像输入到网络之前自动调整其大小,请创建增强图像数据存储,指定所需的图像大小,并将这些数据存储用作激活

Augimdstrain = AugmentedimageGedataStore(InpueSize(1:2),IMDStrain);Augimdstest = AugmentedimageDataStore(InpueSize(1:2),IMDSTEST);图层=“pool10”;featurestrain =激活(net,augimdstrain,图层,“输出”“行”);FeatureStest =激活(NET,AUGIMDST,图层,“输出”“行”);

从培训和测试数据中提取类标签。

YTrain = imdsTrain.Labels;欧美= imdsTest.Labels;

适合图像分类器

利用从训练图像中提取的特征作为预测变量,拟合出多类支持向量机金宝appfitcecoc统计学和机器学习工具箱。

mdl=fitcecoc(特征菌株,YTrain);

测试图像进行分类

使用训练的SVM模型和从测试图像中提取的特征对测试图像进行分类。

featuresTest YPred =预测(mdl);

显示四个样本测试图像及其预测标签。

idx=[1 5 10 15];图形对于i = 1:numel(idx)子图(2,2,i)i = ReadImage(IMDSTEST,IDX(I));标签= ypred(idx(i));imshow(i)标题(标签)终止

图中包含4个轴对象。标题为MathWorks Cap的轴对象1包含一个类型为image的对象。标题为MathWorks Cube的轴对象2包含一个类型为image的对象。标题为MathWorks Playing Cards的轴对象3包含一个类型为image的对象。标题为MathWorks螺丝刀的轴对象4包含一个类型为image的对象。

计算测试集上的分类精度。准确率是网络正确预测标签的比例。

精度=平均值(YPred == YTest)
精度=1

该支持向量机具有较高的准确率。如果使用特征提取的准确率不够高,那么可以尝试迁移学习。

输出参数

全部崩溃

预先训练的SqueezeNet卷积神经网络,返回为DAGNetwork对象。

未经训练的SqueezeNet卷积神经网络架构,返回为LayerGraph对象。

参考文献

[1]图像网. http://www.image-net.org

Iandola, Forrest N., Song Han, Matthew W. Moskewicz, Khalid Ashraf, William J. Dally, Kurt Keutzer。“SqueezeNet: alexnet级精度,参数少50倍,模型尺寸小于0.5 MB。”预印本,2016年11月4日提交。https://arxiv.org/abs/1602.07360。

[3] 安多拉,福里斯特N.“挤压网”https://github.com/forresti/SqueezeNet.

扩展能力

介绍了R2018a