主要内容

squeezenet

卷积神经网络

  • SqueezeNet网络架构

描述

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网络。这个语法等价于网=挤压网

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

例子

全部折叠

加载预训练的SqueezeNet网络。

网=挤压网
net = DAGNetwork with properties: Layers: [68×1 nnet.cnn.layer.Layer] Connections: [75×2 table]

此函数返回一个DAGNetwork对象。

SqueezeNet包含在深度学习工具箱™。要加载其他网络,请使用googlenet以获得从外接程序资源管理器下载预训练网络的链接。

这个例子展示了如何微调预训练的SqueezeNet网络来分类新的图像集合。这个过程被称为迁移学习,通常比训练一个新的网络更快更容易,因为你可以使用更少的训练图像将学习到的特征应用到一个新的任务中。要为交互迁移学习准备一个网络,请使用深度网络设计器。

提取数据

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

解压缩(“MerchData.zip”);

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

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

deepNetworkDesigner (squeezenet);

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

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

导入数据

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

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

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

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

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

可视化数据

使用深度网络设计器,您可以直观地检查训练和验证数据的分布数据选项卡。你也可以在训练前查看随机观察结果和它们的标签。您可以看到,在本例中,数据集中有五个类。

编辑迁移学习网络

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

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

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

改变学习率,使学习在新层比在转移层更快通过设置WeightLearnRateFactor而且BiasLearnRateFactor10.删除最后一个2-D卷积层,连接你的新层。

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

检查网络

要确保已编辑的网络已准备好进行训练,请单击分析,确保深度学习网络分析仪报告零错误。

列车网络的

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

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

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

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

  • 指定迷你批处理大小,即在每次迭代中使用多少图像。为了保证每个epoch都使用整个数据集,设置mini-batch size来平均分配训练样本的数量。

对于本例,设置InitialLearnRate0.0001ValidationFrequency5,MaxEpochs8.因为有55个观测值,所以设定MiniBatchSize11

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

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

导出结果并生成MATLAB代码

导出具有训练权重的网络体系结构培训选项卡上,选择出口>输出训练过的网络和结果.深度网络设计器导出训练好的网络作为变量trainedNetwork_1训练信息作为变量trainInfoStruct_1

trainInfoStruct_1
trainInfoStruct_1 =带字段的结构:TrainingLoss:[1×40双]TrainingAccuracy:[1×40双]ValidationLoss:[3.3420 1.4291 2.1187南南南南南南南南南南南南南南南0.8527 0.5849 0.3967 0.4678南南南南南南南南南南南南南南南南0.3875 0.3749]ValidationAccuracy:[20 30 55.0000南南南南南南南南南南南南南南南65 85年95年95年南南南南南南南南南南南南南南南南95 95]BaseLearnRate:[1×40双]FinalValidationLoss:0.3749 FinalValidationAccuracy: 95

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

新图像分类

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

I = imread(“MerchDataTest.jpg”);

深度网络设计器在训练过程中调整图像大小以匹配网络输入大小。若要查看网络输入大小,请转到设计师窗格,并选择imageInputLayer(第一层)。该网络的输入大小为227 * 227。

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

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

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

[YPred,probs] = category (trainedNetwork_1,I);imshow(I) label = YPred;标题(string(标签)+”、“+ num2str(100*max(probs),3) +“%”);

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

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

迁移学习是深度学习应用中常用的一种方法。你可以使用预先训练好的网络,并将其作为学习新任务的起点。用迁移学习对网络进行微调通常比用随机初始化的权重从头训练网络更快更容易。您可以使用较少的训练图像快速将学习到的特征转移到新任务中。

加载数据

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

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

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

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

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

numTrainImages = numel(imdsTrain.Labels);idx = randperm(numTrainImages,16);I = imtile(imds,“帧”, idx);图imshow(我)

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

负荷预训练网络

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

网=挤压网;

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

analyzeNetwork(净)

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

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

更换最终图层

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

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

lgraph = layerGraph(net);

找到要替换的两个层的名称。您可以手动完成,也可以使用支持函数金宝appfindLayersToReplace自动找到这些层。

[learnableLayer,classLayer] = findLayersToReplace(lgraph);[learnableLayer, classLayer]
ans = 1x2 Layer array with layers: 1 'conv10' 2- d Convolution 1000 1x1x512 convolutions with stride [1 1] and padding [0 000 0] 2 'ClassificationLayer_predictions' Classification Output crossentropyex with 'tench' and 999个其他类

在大多数网络中,具有可学习权重的最后一层是全连接层。在一些网络中,比如SqueezeNet,最后一个可学习层是一个1乘1的卷积层。在这种情况下,用一个新的卷积层替换卷积层,过滤器的数量等于类的数量。为了在新层中比在转移层中更快地学习,增加WeightLearnRateFactor而且BiasLearnRateFactor卷积层的值。

numClasses = numel(categories(imdsTrain.Labels))
numClasses = 5
newConvLayer = convolution2dLayer([1,1],numClasses,“WeightLearnRateFactor”10“BiasLearnRateFactor”10“名称”“new_conv”);lgraph =替换层(lgraph,“conv10”, newConvLayer);

分类层指定网络的输出类。用一个没有类标签的新层替换分类层。trainNetwork在训练时自动设置层的输出类。

newclassificationlayer = classificationLayer(“名字”“new_classoutput”);lgraph =替换层(lgraph,“ClassificationLayer_predictions”, newClassificatonLayer);

列车网络的

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

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

若要自动调整验证图像的大小,而不执行进一步的数据增强,请使用增强图像数据存储,而不指定任何额外的预处理操作。

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

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

选项= trainingOptions(“个”...“MiniBatchSize”11...“MaxEpochs”7...“InitialLearnRate”2的军医,...“洗牌”“every-epoch”...“ValidationData”augimdsValidation,...“ValidationFrequency”3,...“详细”假的,...“阴谋”“训练进步”);

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

netTransfer = trainNetwork(augimdsTrain,lgraph,options);

{

对验证图像进行分类

利用优化后的网络对验证图像进行分类。

[YPred,scores] = category (netTransfer,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));标题(字符串(标签));结束

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

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

YValidation = imdsValidation.Labels;accuracy = mean(YPred == YValidation)
准确度= 1

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

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

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

网=挤压网;

读取图像imread

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

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

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

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

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

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

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

对图像进行分类分类

分类(net,I)
标签=分类甜椒

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

图imshow(I) title(label)

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

这个例子展示了如何从预训练的卷积神经网络中提取学习到的图像特征,并使用这些特征来训练图像分类器。

特征提取是使用预训练深度网络的表示能力的最简单和最快的方法。例如,您可以使用训练支持向量机(SVM)金宝appfitcecoc(统计和机器学习工具箱™)对提取的特征。因为特征提取只需要通过一次数据,如果你没有GPU来加速网络训练,这是一个很好的起点。

加载数据

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

解压缩(“MerchData.zip”);imds = imageDatastore(“MerchData”...IncludeSubfolders = true,...LabelSource =“foldernames”);[imdsTrain,imdsTest] = splitEachLabel(imds,0.7,“随机”);

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

numImagesTrain = numel(imdsTrain.Labels);idx = randperm(numImagesTrain,16);I = imtile(imds,“帧”, idx);图imshow(我)

负荷预训练网络

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

网=挤压网;

分析网络结构。

analyzeNetwork(净)

2022 - 01 - 07 - _16 - 31 - 30. - png

第一层是图像输入层,需要输入图像的大小为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 =激活(net,augimdsTrain,layer,OutputAs=“行”);featuresTest =激活(net,augimdsTest,layer,OutputAs=“行”);

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

TTrain = imdsTrain.Labels;TTest = imdsTest.Labels;

拟合图像分类器

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

mdl = fitcecoc(featuresTrain,TTrain);

分类测试图像

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

YPred = predict(mdl, featurest);

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

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

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

精度=平均值(YPred == TTest)
准确度= 0.9500

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

输出参数

全部折叠

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

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

参考文献

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

Iandola, Forrest N,宋汉,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“SqueezeNet。”https://github.com/forresti/SqueezeNet。

扩展功能

版本历史

在R2018a中引入