squeezenet

SqueezeNet卷积神经网络

描述

SqueezeNet是一个18层深的卷积神经网络。您可以从ImageNet数据库中加载经过训练的网络的预训练版本,该版本包含了100多万张图像[1]。这个预先训练好的网络可以将图像分成1000个对象类别,比如键盘、鼠标、铅笔和许多动物。因此,该网络学会了丰富的特征表示,为广泛的图像。该函数返回一个SqueezeNet v1.1网络,该网络的精度与SqueezeNet v1.0类似,但是每个预测需要的浮点操作更少[3]。该网络具有的227逐227输入的图像的大小。对于MATLAB更多的预训练的网络®预先训练的深度神经网络

您可以使用分类使用SqueezeNet网络的新图像进行分类。例如,参见利用挤压网对图像进行分类

您可以使用转移学习重新训练一个SqueezeNet网络来执行一个新的任务。例如,参见交互式转移学习使用SqueezeNet

= squeezenet返回训练有素的ImageNet数据集的SqueezeNet网络。

= squeezenet( '权重','imagenet'返回训练有素的ImageNet数据集的SqueezeNet网络。此语法等效于净= squeezenet

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

例子

全部折叠

加载预训练SqueezeNet网络。

净= squeezenet
净= DAGNetwork与属性:层:[68×1 nnet.cnn.layer.Layer]连接:[75×2表]

这个函数返回一个DAGNetwork对象。

SqueezeNet包括深度学习工具箱内™。加载其他网络,使用的功能,例如googlenet获取从附加资源管理器下载预先训练好的网络的链接。

这个例子说明了如何微调预训练SqueezeNet网络图像的新的集合进行分类。这个过程被称为转移学习,通常比培养一个新的网络,因为你可以申请学特性,使用训练图像的数少的新任务,更快,更容易。要准备迁移学习交互的网络,使用深层网络设计者。

提取数据

在工作区中,提取MathWorks合并数据集。这是一个小数据集,包含MathWorks商品的75个图像,属于5个不同的类(立方体打牌螺丝刀,火炬)。

解压缩(“MerchData.zip”);

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

开深网设计师。

deepNetworkDesigner

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

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

探索网络曲线。用鼠标,使用放大Ctrl+滚轮。要平移,可以使用箭头键,或者按住滚轮并拖动鼠标。选择一个层来查看它的属性。取消选中所有层以查看“。”中的网络摘要属性窗格。

导入数据

将数据加载到深度网络设计器中数据选项卡,单击导入数据。将打开导入数据对话框。

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

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

指定增强操作的训练图像进行。对于这个例子,适用于x轴的随机旋转从范围[-90,90]度的随机反射,并从范围[1,2]的随机重新缩放。数据增强有助于防止网络过度拟合和记忆训练图像的具体细节。

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

数据可视化

使用深度网络设计器,您可以可视化地检查训练和验证数据的分布数据窗格。您可以看到,在这个示例中,数据集中有5个类。

编辑网络转移学习

网络提取图像的卷积层的特征在于最后的可学习层和最终分类层中使用与输入图像进行分类。这两层,'conv10''ClassificationLayer_predictions'在SqueezeNet,包含了如何的特征,网络提取物组合成类的概率,损失价值,并预测标签的信息。重新训练一个预训练的网络到新的图像进行分类,替换这些两层适应新的数据集的新层。

在大多数网络中,与可学习权重的最后层是完全连接层。在一些网络中,如SqueezeNet,最后可学习层是最终卷积层代替。在这种情况下,代替与滤波器的数目新卷积层卷积层等于类的数量。

设计师窗格,拖动一个新的convolutional2dLayer到画布上。为了匹配原始的卷积层,设置FilterSize1,- 1。更改NumFilters对于新数据中的类数,在本例中,

改变学习率,这样的学习是在新的层比在转移层更快地通过设置组WeightLearnRateFactorBiasLearnRateFactor到10。删除最后一个2d卷积层,然后连接新层。

更换输出层。滚动到年底层的图书馆拖拽一个新的classificationLayer到画布上。删除原来的输出层,连接你的新层。

检查网络

为了确保您编辑的网络是准备训练,点击分析,并确保深学习网络分析报告零次失误。

列车网络

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

  • InitialLearnRate到一个小的值,以减缓学习的层次转移。

  • 指定ValidationFrequency以便在验证数据准确性时计算一次每一个时代。

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

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

对于本例,setInitialLearnRate0.0001ValidationFrequency,MaxEpochs8。由于有55个观测值,集合MiniBatchSize到11个。

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

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

导出结果,并生成MATLAB代码

为了与训练的权重导出的网络架构,在训练选项卡上,选择导出>导出训练的网络和结果。深层网络设计者出口训练有素的网络变量trainedNetwork_1而作为变量培训信息trainInfoStruct_1

trainInfoStruct_1
trainInfoStruct_1 =结构体字段:TrainingLoss:[1×40双]TrainingAccuracy:[1×40双]ValidationLoss:[4.8267 1.2332 2.1034南南南南南南南南南南南南南南南0.6614 0.4312 0.2472 0.2878南南南南南南南南南南南南南南南南0.2647 0.2893]ValidationAccuracy:[10南南南南南南南南南南南80 95 90年南南南南南南南南南南南南95 95年南南南南南南南南95]BaseLearnRate:[1×40双]FinalValidationLoss:0.2893 FinalValidationAccuracy: 95

您还可以生成MATLAB代码,它再现了网络使用的训练方案。在训练选项卡上,选择导出>生成培训代码。研究MATLAB代码,了解如何以编程方式准备培训数据、创建网络体系结构和培训网络。

分类新形象

利用训练后的网络加载新图像进行分类。

I = imread(“MerchDataTest.jpg”);

深度网络设计者在训练时调整图像的大小以匹配网络输入的大小。要查看网络输入大小,请转到设计师窗格,然后选择imageInputLayer(第一层)。这个网络的输入大小为227 * 227。

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

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

用训练网络分类的测试图像。

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

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

SqueezeNet已经训练了超过100万张图片,可以将图片分成1000个对象类别(如键盘、咖啡杯、铅笔和许多动物)。该网络已经为广泛的图像学习了丰富的特征表示。该网络以图像为输入,输出图像中对象的标签以及每个对象类别的概率。

在深度学习应用中,迁移学习是一种常用的学习方法。你可以把一个预先训练好的网络作为学习新任务的起点。与从零开始使用随机初始化的权值训练网络相比,使用转移学习对网络进行微调通常要快得多,也容易得多。您可以使用较少的训练图像将学到的特性快速转移到新任务中。

数据加载

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

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

将数据划分为培训和验证数据集。使用70%的图像用于培训,30%用于验证。splitEachLabel分裂的图片将数据存储转换为两个新的数据存储。

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

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

numTrainImages = numel(imdsTrain.Labels);IDX = randperm(numTrainImages,16);I = imtile(IMDS,“框架”,idx);图imshow(I)

加载预训练网络

加载预训练SqueezeNet神经网络。

净= squeezenet;

使用analyzeNetwork显示网络体系结构的交互式可视化和有关网络层的详细信息。

analyzeNetwork(净)

第一层是图像输入层,需要大小为227×227×3的输入图像,其中3是颜色通道的数量。

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

取代最后一层

网络提取图像的卷积层的特征在于最后的可学习层和最终分类层中使用与输入图像进行分类。这两层,'conv10''ClassificationLayer_predictions'在SqueezeNet,包含了如何的特征,网络提取物组合成类的概率,损失价值,并预测标签的信息。重新训练一个预训练的网络到新的图像进行分类,替换这些两层适应新的数据集的新层。

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

lgraph = layerGraph(净值);

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

[learnableLayer,classLayer] = findLayersToReplace(lgraph);[learnableLayer,classLayer]
1’conv10’Convolution 1000 1x1x512 convolutions with stride [1 1] and padding[0 000] 2’classificationlayer_’Classification Output crossentropyex with‘tench’and 999 other classes

在大多数网络中,与可学习权重的最后层是完全连接层。在一些网络中,如SqueezeNet,最后可以学习的层为1×1的卷积层代替。在这种情况下,代替与滤波器的数目新卷积层卷积层等于类的数量。要了解在新的图层快于传输层,增加WeightLearnRateFactorBiasLearnRateFactor卷积层的值。

numClasses =元素个数(类别(imdsTrain.Labels))
numClasses = 5
newConvLayer = convolution2dLayer([1,1],numClasses,'WeightLearnRateFactor'10“BiasLearnRateFactor”10“名称”“new_conv”);lgraph = replaceLayer(lgraph,'conv10',newConvLayer);

分级层指定网络的输出的类。与无级标记更换一个新的分类层。trainNetwork在训练时自动设置层的输出类。

newClassificatonLayer = classificationLayer ('名称'“new_classoutput”);lgraph = replaceLayer(lgraph,'ClassificationLayer_predictions',newClassificatonLayer);

列车网络

网络需要大小227逐227×3的输入图像,但在图像数据存储这些图像具有不同的大小。使用增强的图像数据存储到自动调整训练图像。指定附加增强操作,以在训练图像进行:随机地翻转训练图像沿着垂直轴,并随机起来水平地和垂直平移30个像素。数据增强有助于防止网络过度拟合和记忆训练图像的具体细节。

pixelRange = [- 3030];imageAugmenter = imageDataAugmenter ('RandXReflection',真的,'RandXTranslation'pixelRange,“RandYTranslation”,pixelRange);augimdsTrain = augmentedImageDatastore (inputSize (1:2), imdsTrain,'DataAugmentation',imageAugmenter);

自动调整,而不执行进一步的数据扩充的验证图像,使用的增强图像数据存储区,而无需指定任何附加的预处理操作。

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

指定培训选项。对于转移学习,保留预先训练的网络的早期层的特征(转移的层权重)。为了在转换层中减慢学习速度,可以将初始学习速率设置为一个小的值。在前面的步骤中,您增加了卷积层的学习速率因子,以加速在新最终层中的学习。这种学习速率设置的组合只在新层中产生快速学习,而在其他层中产生较慢的学习。当进行迁移学习时,你不需要训练很多个时代。epoch是整个训练数据集的完整训练周期。指定小批量大小为11,以便在每个epoch中考虑所有数据。软件每隔一段时间验证一次网络ValidationFrequency迭代在训练。

选择= trainingOptions ('SGDM'“MiniBatchSize”11“MaxEpochs”,7,“InitialLearnRate”2的军医,“洗牌”“every-epoch”“ValidationData”,augimdsValidation,“ValidationFrequency”,3,“放牧”假的,“情节”“训练进步”);

训练由传送层和新层组成的网络。默认情况下,trainNetwork使用GPU(如果可用)(需要并行计算工具箱™和启用CUDA®GPU计算能力3.0或更高版本)。否则,它使用一个CPU。您也可以通过指定执行环境“执行环境”的名-值对参数trainingOptions

netTransfer = trainNetwork (augimdsTrain、lgraph选项);

验证图像进行分类

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

[YPred,分数]= (netTransfer augimdsValidation)进行分类;

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

idx = randperm(元素个数(imdsValidation.Files), 4);数字I = 1:4副区(2,2,i)的I = readimage(imdsValidation,IDX(I));imshow(I)标记= YPred(IDX(I));标题(字符串(标签));结束

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

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

有关提高分类精度的技巧,请参阅深度学习的秘诀和技巧

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

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

净= squeezenet;

阅读使用图像imread

I = imread('peppers.png');图imshow(I)

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

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

裁剪图像到网络的输入大小。或者,您可以使用以下选项调整图像的大小imresize

I = I(1:SZ(1),1:SZ(2),1:SZ(3));图imshow(I)

使用以下方法对图像进行分类分类

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

显示图像和分类结果在一起。

图imshow(I)标题(标签)

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

数据加载

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

解压缩('MerchData.zip');IMDS = imageDatastore('MerchData'“IncludeSubfolders”,真的,“LabelSource”“foldernames”);[imdsTrain, imdsTest] = splitEachLabel (imd, 0.7,“随机”);

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

numImagesTrain = numel(imdsTrain.Labels);IDX = randperm(numImagesTrain,16);I = imtile(IMDS,“框架”,idx);图imshow(I)

加载预训练网络

加载预训练SqueezeNet网络。SqueezeNet训练上超过一百万的图像,并可以将图像分为1000点对象的类别,例如,键盘,鼠标,笔,和许多动物。其结果是,该模型已经学会了丰富的功能表示为各种图像。

净= squeezenet;

分析网络架构。

analyzeNetwork(净)

第一层是图像输入层,需要大小为227×227×3的输入图像,其中3是颜色通道的数量。

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

提取图像特征

该网络构造了输入图像的层次表示。较深的层包含较高层次的特征,使用较早层次的较低层次特征构造。要获得训练和测试图像的特征表示,使用激活在全球平均池层“pool10”。要获得的图像的较低水平表达,在网络中使用较早层。

网络需要大小227逐227×3的输入图像,但在图像数据存储这些图像具有不同的大小。自动调整的训练和测试图像它们被输入到网络之前,创建增强图像数据存储中,指定期望的图像的尺寸,并使用这些数据存储作为输入参数激活

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

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

YTrain = imdsTrain.Labels;YTest = imdsTest.Labels;

适合图像分类器

使用从所述训练图像作为预测变量使用提取的特征和适合多类别支持向量机(SVM)万博1manbetxfitcecoc(统计和机器学习工具箱)。

mdl = fitcecoc (featuresTrain YTrain);

测试图像进行分类

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

YPred =预测(MDL,featuresTest);

显示四张带有预测标签的样本测试图像。

idx = [1 5 10 15];数字i = 1:numel(idx) subplot(2,2,i) i = readimage(imdsTest,idx(i));标签= YPred (idx (i));imshow (I)标题(标签)结束

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

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

该SVM具有较高的准确率。如果使用特征提取的准确率不够高,可以尝试转移学习。

输出参数

全部折叠

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

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

参考

[1]ImageNet。http://www.image-net.org

[2] Iandola, Forrest N., Song Han, Matthew W. Moskewicz, Khalid Ashraf, William J. Dally和Kurt Keutzer。“SqueezeNet: alexnet级精度,参数减少50倍,模型大小小于0.5 MB。”Preprint, submitted November 4, 2016. https://arxiv.org/abs/1602.07360.

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

扩展功能

介绍了在R2018a