主要内容

挤压网

SqueezeNet卷积神经网络

描述

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

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

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

例子

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

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

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

例子

全部折叠

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

净=挤压净
net = DAGNetwork with properties: Layers: [68×1 net.cnn.layer. layer]连接:[75×2 table]

这个函数返回达格网络对象。

深度学习工具箱™中包含了SqueezeNet。要加载其他网络,请使用如下函数水壶获取从附加模块资源管理器下载预训练网络的链接。

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

提取数据

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

解压缩(“MerchData.zip”);

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

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

deepNetworkDesigner (squeezenet);

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

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

导入数据

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

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

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

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

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

可视化数据

使用深度网络设计器,您可以直观地查看训练和验证数据的分布数据你也可以在训练前通过简单的检查来查看随机观察及其标签。你可以看到,在这个例子中,数据集中有五个类。

编辑传输学习网络

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

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

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

更改学习率,使学习在新图层中比设置在传输的层中更快举重BiasLearnRateFactor10。删除最后一个二维卷积层,然后连接新层。

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

检查网络

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

列车网络的

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

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

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

  • 指定少量的历元。历元是整个训练数据集上的完整训练周期。对于转移学习,您不需要训练尽可能多的历元。

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

对于此示例,设置InitialLearnRate0.0001验证频率5,及最大时代8.由于有55个观测值,设置MiniBatchSize11

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

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

导出结果并生成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(“merchdattest.jpg”);

Deep Network Designer在培训期间调整图像大小以匹配网络输入大小。若要查看网络输入大小,请转到设计师窗格,然后选择图像输入层(第一层)。这个网络的输入尺寸是227乘227。

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

I=imresize(I,[227]);

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

(YPred,聚合氯化铝)= (trainedNetwork_1, I)进行分类;imshow(I) label = YPred;标题(string(标签)+", "+num2str(最大值为100*3)+“%”);

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

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

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

加载数据

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

解压缩(“MerchData.zip”);imds=图像数据存储(“MerchData”......“包含子文件夹”是的,......“标签源”'foldernames');

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

[imdsTrain, imdsValidation] = splitEachLabel (imd, 0.7,“随机化”);

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

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

负载Pretrained网络

加载预先训练的SqueezeNet神经网络。

净=挤压净;

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

分析网络(net)

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

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

替换最后一层

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

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

lgraph=层图(净);

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

[learnableLayer,classLayer]=findlayerstorereplace(lgraph);[learnableLayer,classLayer]
ans = 1×2 Layer array with layers: 1 'conv10' Convolution 1000 1×1×512 convolutions with stride [1 1] and padding [0 00] 2 'ClassificationLayer_predictions' Classification Output crossentropyex with 'tench' and 999其他类

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

numclasses = numel(类别(imdstrain.labels))
numClasses = 5
newConvLayer = convolution2dLayer([1,1],numClasses,“权重学习速率因子”10,'biaslearnratefactor'10,“姓名”“new_conv”);lgraph=替换层(lgraph,“conv10”,新康维层);

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

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

列车网络的

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

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

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

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

指定培训选项。对于迁移学习,保留预先训练网络的早期层的特征(迁移层权值)。为了降低传输层的学习速度,将初始学习率设置为一个较小的值。在前面的步骤中,您增加了卷积层的学习率因子,以加速新的最终层中的学习。这种学习率设置的组合只会导致在新层中学习快,而在其他层中学习慢。当进行迁移学习时,你不需要训练那么多的纪元。epoch是整个训练数据集上的一个完整的训练周期。指定迷你批处理大小为11,以便在每个epoch中考虑所有数据。软件每次都要对网络进行验证验证频率迭代在训练。

选项=培训选项(“sgdm”......'minibatchsize',11,......“MaxEpochs”7......“InitialLearnRate”2的军医,......“洗牌”“每个时代”......“验证数据”,augimdsValidation,......“验证频率”3.......“冗长”,错,......“阴谋”'培训 - 进步');

培训由转移和新层组成的网络。默认情况下,trainNetwork如果GPU可用,则使用GPU。这需要并行计算工具箱™ 和支持的GPU设备。有关支持的设备的信息,请参阅金宝appGPU版金宝app本支持(并行计算工具箱).否则,trainNetwork使用CPU。您还可以使用“ExecutionEnvironment”的名称-值对参数培训选项

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

验证图像进行分类

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

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

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

idx=randperm(numel(imdsValidation.Files),4);图i = 1:4 subplot(2,2,i) i = readimage(imdsValidation,idx(i));imshow(I) label = YPred(idx(I));标题(字符串(标签));结束

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

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

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

使用SqueezeNet读取、调整大小和分类图像。

首先,加载一个预先训练过的SqueezeNet模型。

净=挤压净;

使用以下命令读取图像伊姆雷德

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

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

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

sz=净层(1).InputSize
深圳=1×3227 227 3.

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

I=imresize(I,sz(1:2));图imshow(I)

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

使用图像分类分类

标签=分类(净,I)
标签=绝对的甜椒

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

图imshow(I)标题(标签)

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

此示例演示如何从预训练卷积神经网络中提取学习的图像特征,并使用这些特征训练图像分类器。特征提取是使用预训练深层网络表示能力的最简单、最快速的方法。例如,您可以使用金宝app菲切克(统计和机器学习工具箱™)上提取的功能。因为特征提取只需要一个通过数据,所以如果您没有GPU以加速网络培训,则是一个很好的起点。

加载数据

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

解压缩(“MerchData.zip”);imds=图像数据存储(“MerchData”......“包含子文件夹”是的,......“标签源”'foldernames');[imdsTrain, imdsTest] = splitEachLabel (imd, 0.7,“随机化”);

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

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

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

负载Pretrained网络

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

净=挤压净;

分析网络体系结构。

分析网络(net)

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

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

提取图像特征

该网络构建了输入图像的层次表示。更深的层包含更高级别的特征,使用早期层的较低级别特征构建。要获取训练和测试图像的特征表示,请使用激活在全球平均池层“池10”。要获得图像的较低级别表示,请使用网络中较早的层。

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

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

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

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

适合图像分类器

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

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

测试图像进行分类

利用训练好的支持向量机模型和从测试图像中提取的特征对测试图像进行分类。

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包含图像类型的对象。带有标题MathWorks立方体的轴2包含图像类型的对象。带有标题MathWorks扑克牌的轴3包含图像类型的对象。带有标题MathWorks螺丝刀的轴4包含图像类型的对象。

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

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

该支持向量机具有较高的精度。如果使用特征提取的精度不够高,则尝试转移学习。

输出参数

全部折叠

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

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

参考文献

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

[2] 安多拉,福勒斯特N.,宋汉,马修W.莫斯科维茨,哈立德·阿什拉夫,威廉J.戴利和库尔特·库策。“挤压网:AlexNet级精度,参数少50倍,模型尺寸<0.5 MB。”预印本,2016年11月4日提交。https://arxiv.org/abs/1602.07360.

福雷斯特·伊安多拉“SqueezeNet。”https://github.com/forresti/SqueezeNet。

扩展能力

介绍了R2018a