主要内容

训练深度学习网络对新图像进行分类

这个例子展示了如何使用迁移学习来重新训练卷积神经网络来对一组新的图像进行分类。

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

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

加载数据

将新图像解压并作为图像数据存储加载。这个非常小的数据集只包含75张图像。将数据分为训练数据集和验证数据集。使用70%的图像进行训练,30%的图像进行验证。

解压(“MerchData.zip”);imd = imageDatastore (“水星”,...“IncludeSubfolders”符合事实的...“LabelSource”,“foldernames”); [imdsTrain,imdsValidation]=拆分每个标签(imds,0.7);

负载Pretrained网络

加载一个预先训练好的GoogLeNet网络。如果深入学习工具箱™ 模型谷歌网金宝app支持包未安装,则软件提供下载链接。

要尝试不同的预训练网络,请在MATLAB®中打开此示例并选择不同的网络。例如,你可以试试看squeezenet,这是一个比googlenet.您可以在其他预先训练过的网络上运行这个示例。有关所有可用网络的列表,请参见负载Pretrained网络

网=googlenet;

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

analyzeNetwork(净)

第一个元素网络的属性是图像的输入层。对于GoogLeNet网络,这一层需要输入尺寸为224 × 224 × 3的图像,其中3是彩色通道的数量。其他网络可能需要不同大小的输入图像。例如,Xception网络需要大小为299 × 299 × 3的图像。

net.Layers(1)
ans = ImageInputLayer with properties: Name: 'data' InputSize: [224 224 3] Hyperparameters DataAugmentation: 'none' Normalization: 'zerocenter' NormalizationDimension: 'auto' Mean: [224×224×3 single]
inputSize=net.Layers(1).inputSize;

替换最后一层

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

将经过训练的网络转换为图层图。

lgraph = layerGraph(净);

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

[learnableLayer, classLayer] = findLayersToReplace (lgraph);[learnableLayer, classLayer]
ans=1×2带层的层阵列:1个“loss3分类器”完全连接1000个完全连接的层2个“输出”分类输出带“tench”和999个其他类的crossentropyex

在大多数网络中,具有可学习权值的最后一层是完全连接层。将这个完全连接层替换为一个新的完全连接层,输出的数量等于新数据集中的类的数量(本例中为5)。在一些网络中,比如SqueezeNet,最后的可学习层是一个1乘1的卷积层。在这种情况下,将卷积层替换为一个新的卷积层,该卷积层的过滤器数量等于类的数量。为了在新层中比在转移层中学习得更快,增加该层的学习率因子。

numClasses =元素个数(类别(imdsTrain.Labels));如果isa (learnableLayer'nnet.cnn.layer.FullyConnectedLayer'newLearnableLayer = fullconnectedlayer (numClasses,...“姓名”,“新俱乐部”,...“WeightLearnRateFactor”,10,...“BiasLearnRateFactor”10);埃尔塞夫isa (learnableLayer“nnet.cnn.layer.Convolution2DLayer”)newLearnableLayer=卷积2dLayer(1,numClass,...“姓名”,“new_conv”,...“WeightLearnRateFactor”,10,...“BiasLearnRateFactor”10);结束lgraph = replaceLayer (lgraph learnableLayer.Name newLearnableLayer);

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

newClassLayer=classificationLayer(“姓名”,“new_classoutput”); lgraph=replaceLayer(lgraph,classLayer.Name,newClassLayer);

要检查新图层是否正确连接,请绘制新图层图并放大网络的最后几层。

图(“单位”,“正常化”,“位置”,[0.3 0.3 0.4 0.4]); plot(lgraph)ylim([0,10])

冻结初始层

网络现在可以在新的映像集上进行再训练了。你还可以选择将网络中较早层次的学习速率设置为零,从而“冻结”这些层次的权重。在培训期间,trainNetwork不更新冻结图层的参数。由于不需要计算冻结层的梯度,冻结许多初始层的权重可以显著加快网络训练。如果新数据集较小,则冻结早期网络层也可以防止这些层与新数据集过度拟合。

提取图层图的图层和连接,并选择要冻结的图层。在GoogLeNet中,前10层构成了网络最初的“主干”。使用支持函数金宝appfreezeWeights将前10层的学习率设置为零。使用支持功能金宝appcreateLgraphUsingConnections按原顺序重新连接所有层。新的层图包含相同的层,但先前层的学习率设为零。

层= lgraph.Layers;连接= lgraph.Connections;层(1:10)= freezeWeights(层(1:10));lgraph = createLgraphUsingConnections(层,连接);

列车网络

网络需要大小为224-x-224-x-3的输入图像,但图像数据存储中的图像大小不同。使用增强图像数据存储自动调整训练图像的大小。指定要在训练图像上执行的其他增强操作:沿垂直轴随机翻转训练图像,并将其随机平移至30像素,并将其水平和垂直缩放至10%。数据扩充有助于防止网络过度拟合和记忆训练图像的确切细节。

像素范围=[-30];标度范围=[0.91.1];imageAugmenter=imageDataAugmenter(...“RandXReflection”符合事实的...“RandXTranslation”,像素范围,...“RandYTranslation”,像素范围,...“RandXScale”,鳞片,...“兰迪斯卡尔”, scaleRange);augimdsTrain = augmentedImageDatastore (inputSize (1:2), imdsTrain,...“数据增强”, imageAugmenter);

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

augimdsValidation=增强图像数据存储(inputSize(1:2),imdsValidation);

指定培训选项。设置InitialLearnRate降低到一个很小的值,以减缓尚未冻结的转移层的学习。在前面的步骤中,您增加了最后一个可学习层的学习率因子,以加快新的最后一层的学习率。这种学习速率设置的组合导致在新层中学习快,在中间层中学习慢,而在较早的冻结层中没有学习。

指定要训练的纪元数。当进行迁移学习时,你不需要训练那么多的纪元。epoch是整个训练数据集上的一个完整的训练周期。指定小批量大小和验证数据。每个epoch计算一次验证精度。

miniBatchSize = 10;valFrequency =地板(元素个数(augimdsTrain.Files) / miniBatchSize);选择= trainingOptions (“个”,...“MiniBatchSize”miniBatchSize,...“MaxEpochs”6...“InitialLearnRate”3的军医,...“洗牌”,“every-epoch”,...“ValidationData”augimdsValidation,...“ValidationFrequency”valFrequency,...“详细”假的,...“情节”,“培训进度”);

使用训练数据训练网络。默认情况下,trainNetwork如果GPU可用,则使用GPU。这需要并行计算工具箱™和支持的GPU设备。金宝app有关支持的设备的信息,请参见金宝appGPU支金宝app持情况(并行计算工具箱).否则,trainNetwork使用一个CPU。属性也可以指定执行环境“执行环境”的名称-值对参数trainingOptions.因为数据集很小,所以训练速度很快。

网= trainNetwork (augimdsTrain、lgraph选项);

验证图像进行分类

使用微调网络对验证图像进行分类,并计算分类精度。

(YPred,聚合氯化铝)=(网络,augimdsValidation)进行分类;精度= mean(YPred == imdsvalidate . labels)
精度=0.9000

显示具有预测标签的四个样本验证图像以及具有这些标签的图像的预测概率。

idx = randperm(元素个数(imdsValidation.Files), 4);数字i=1:4子批次(2,2,i)i=readimage(imdsValidation,idx(i));imshow(i)label=YPred(idx(i));title(string(label)+", "+ num2str(100 *马克斯(聚合氯化铝(idx(我),:)),3)+"%");结束

参考文献

[1] Szegedy, Christian, Liu Wei, Jia Yangqing, Pierre Sermanet, Scott Reed, Dragomir angelov, Dumitru Erhan, Vincent Vanhoucke和Andrew Rabinovich。“更深入的回旋。”在计算机视觉与模式识别IEEE会议论文集1 - 9页。2015.

另见

|||||||||

相关的话题