主要内容

挤压网

挤压网络卷积神经网络

  • 挤压网网络结构

描述

SqueezeNet是一个有18层深度的卷积神经网络。您可以在ImageNet数据库的100多万张图像上加载预先训练过的网络版本[1].经过预先训练的网络可以将图像分为1000个对象类别,如键盘、鼠标、铅笔和许多动物。因此,该网络学习了丰富的特征表示范围广泛的图像。该函数返回一个SqueezeNet v1.1网络,其精度与SqueezeNet v1.0类似,但每次预测所需的浮点操作更少[3].该网络的图像输入尺寸为227 × 227。用于MATLAB中更多的预训练网络®,请参阅预先训练的深度神经网络

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

您可以使用迁移学习对SqueezeNet网络进行再培训,使其执行新任务。例如,请参见使用SqueezeNet进行交互式迁移学习

例子

= squeezenet返回在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”);

在深层网络设计器中打开SqueezeNet

使用SqueezeNet打开深层网络设计器。

deepNetworkDesigner (squeezenet);

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

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

导入数据

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

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

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

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

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

可视化数据

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

编辑迁移学习网络

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

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

设计师窗格中,拖动一个新的convolution2dLayer到画布上。为了匹配原始卷积层,设置FilterSize1,1改变微粒过滤器更改为新数据中的类数,在本例中,5

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

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

检查网络

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

列车网络的

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

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

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

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

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

对于本例,set初始学习率0.0001ValidationFrequency5,最大时代8.由于有55个观测值,设置小批量11

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

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

导出结果并生成MATLAB代码

要导出具有训练权重的网络体系结构,请在训练选项卡,选择出口>出口培训网络和成果.深度网络设计器输出训练有素的网络作为变量培训网络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(“MerchDataTest.jpg”);

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

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

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

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

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

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

SqueezeNet已经训练了超过100万幅图像,并可以将图像分为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
输入大小=1×3227 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的卷积层。在这种情况下,将卷积层替换为一个新的卷积层,该卷积层的过滤器数量等于类的数量。要想在新的层次上比在转移的层次上学得更快,就要增加WeightLearnRateFactor双线性学习因子卷积层的值。

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

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

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

列车网络的

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

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

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

augimdsValidation = augmentedImageDatastore (inputSize (1:2), imdsValidation);

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

选择= trainingOptions (“sgdm”...“MiniBatchSize”11...“MaxEpochs”7...“初始学习率”,2e-4,...“洗牌”“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网络第一层的属性。

深圳= net.Layers (1) .InputSize
深圳=1×3227 227 3

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

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

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

对图像进行分类,使用分类

标签=分类(净,我)
标签=明确的甜椒

同时显示图像和分类结果。

图imshow(I)标题(标签)

图中包含一个轴对象。标题为bell pepper的axes对象包含一个类型为image的对象。

这个例子展示了如何从预先训练的卷积神经网络中提取学习到的图像特征,并使用这些特征来训练图像分类器。特征提取是利用预先训练的深度网络的表征能力的最简单和最快的方法。例如,您可以使用以下方法训练支持向量机(SVM)金宝appfitcecoc(Statistics and Machine Learning Toolbox™)。因为特征提取只需要对数据进行一次遍历,所以如果你没有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
输入大小=1×3227 227 3

提取图像特征

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

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

augimdsTrain = augmentedImageDatastore (inputSize (1:2), imdsTrain);augimdsTest = augmentedImageDatastore (inputSize (1:2), imdsTest);层=“pool10”;featuresTrain =激活(净、augimdsTrain层,“输出”“行”);featuresTest =激活(净、augimdsTest层,“输出”“行”);

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

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

适合图像分类器

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

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

对测试图像进行分类

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

featuresTest YPred =预测(mdl);

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

idx=[1 5 10 15];图形对于i = 1:numel(idx) subplot(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