火车深学习网络分类新形象

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

预训练的图像分类网络已经培训了超过一万张图片,并可以将图像分为1000个对象的类别,如键盘,咖啡杯,铅笔,和许多动物。该网络已经学会了丰富的功能表示为各种图像。网络拍摄图像作为输入,并且然后输出一个标签与概率为每个对象类别的图像一起的对象。

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

数据加载

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

解压('MerchData.zip');IMDS = imageDatastore('MerchData'...'IncludeSubfolders',真正,...'LABELSOURCE''foldernames');[imdsTrain,imdsValidation] = splitEachLabel(IMDS,0.7);

加载预训练网络

加载预训练GoogLeNet网络。如果深度学习工具箱™模式对于GoogLeNet网络万博1manbetx支持包没有安装,那么该软件提供了下载链接。

尝试不同的预训练网络,打开MATLAB®这个例子中,选择不同的网络。例如,你可以试试squeezenet,一个网络,甚至比快googlenet。您可以运行与其他预训练网络这个例子。对于所有可用的网络列表,请参阅加载预训练网络

网=googlenet;

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

analyzeNetwork(净)

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

net.Layers(1)
ANS = ImageInputLayer与属性:名称: '数据' InputSize:[224 224 3]超参数DataAugmentation: '无' 归一化: 'zerocenter' 平均数:[224×224×3单一]
inputSize = net.Layers(1).InputSize;

替换最后几层

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

提取从训练的网络的层图。如果网络是一个SeriesNetwork物体,如AlexNet,VGG-16,或VGG-19,然后将其转换层的列表中的net.Layers到层图。

如果isa(净,'SeriesNetwork')lgraph = layerGraph(net.Layers);其他的lgraph = layerGraph(净值);结束

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

[learnableLayer,classLayer] = findLayersToReplace(lgraph);[learnableLayer,classLayer]
1 'loss3-classifier'全连接1000个全连接的Layer 2 'output' Classification输出cross - sentropyex with 'tench'和999个其他类

在大多数网络中,与可学习权重的最后层是完全连接层。用的输出数的新完全连接层替代这个完全连接层等于类的数量在新的数据集(图5,在此实例中)。在一些网络中,如SqueezeNet,最后可以学习的层为1×1的卷积层代替。在这种情况下,代替与滤波器的数目新卷积层卷积层等于类的数量。要学会在新层快于传输层,增加该层的学习率的因素。

numClasses =元素个数(类别(imdsTrain.Labels));如果isa (learnableLayer'nnet.cnn.layer.FullyConnectedLayer')newLearnableLayer = fullyConnectedLayer(numClasses,...'名称''new_fc'...“WeightLearnRateFactor”10,...'BiasLearnRateFactor'10);ELSEIFisa (learnableLayer“nnet.cnn.layer.Convolution2DLayer”)newLearnableLayer = convolution2dLayer(1,numClasses,...'名称'“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]);情节(lgraph)ylim([0,10])

冻结初始层

现在,该网络已经准备好重新训练新的一组图像。您可以选择将这些层的学习速率设置为零,从而“冻结”网络中较早层的权重。在培训期间,trainNetwork不更新冻层的参数。由于冰冻层的梯度不需要计算,冻结了许多初步层的权重可以显著加快网络训练。如果新的数据集很小,那么冻结早些时候网络层还可以防止这些层过度拟合到新的数据集。

提取层图的层和连接,并选择要冻结哪些层。在GoogLeNet中,前10层构成了网络的初始“茎”。使用支持功能万博1manbetxfreezeWeights设置学习下调至零前10层。使用支持功能万博1manbetxcreateLgraphUsingConnections按照原来的顺序重新连接所有层。新的层图包含相同的层,但是将早期层的学习率设置为零。

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

列车网络

网络需要大小224逐224×3的输入图像,但在图像中的数据存储区中的图像具有不同的尺寸。使用增强的图像数据存储到自动调整训练图像。指定附加增强操作,以在训练图像进行:随机地翻转训练图像沿垂直轴和随机起来转换为30个像素和在水平和垂直缩放它们高达10%。数据增强有助于防止网络过度拟合和记忆训练图像的具体细节。

pixelRange = [-30 30];scaleRange = [0.9 1.1]。imageAugmenter = imageDataAugmenter(...'RandXReflection',真正,...“RandXTranslation”,pixelRange,...“RandYTranslation”,pixelRange,...“RandXScale”,scaleRange,...'RandYScale',scaleRange);augimdsTrain = augmentedImageDatastore (inputSize (1:2), imdsTrain,...'DataAugmentation',imageAugmenter);

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

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

指定培训选项。组InitialLearnRate较小的值将放缓,尚未冻结被转印层学习。在上一步中,你提高学习率的因素最后可以学习层,加快新的最终层学习。学习率设置导致快速学习新层,学习速度较慢,中间层,并在早期,冻层没有学习的组合。

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

miniBatchSize = 10;valFrequency =地板(numel(augimdsTrain.Files)/ miniBatchSize);选项= trainingOptions(“个”...“MiniBatchSize”miniBatchSize,...'MaxEpochs',6,...“InitialLearnRate”3的军医,...“洗牌”“每个历元”...'ValidationData'augimdsValidation,...'ValidationFrequency'valFrequency,...“详细”,假,...“情节”“训练进度”);

使用培训训练数据网络。默认情况下,trainNetwork如果有的话,使用GPU(需要并行计算工具箱™和CUDA®支持的GPU,具有3.0或更高的计算能力)。否则,trainNetwork使用CPU。您也可以通过指定执行环境“执行环境”的名称 - 值对参数trainingOptions。因为数据集很小,所以训练很快。

净= trainNetwork(augimdsTrain,lgraph,选项);

验证图像进行分类

分类使用微调网络验证的图像,并计算出分类精度。

(YPred,聚合氯化铝)=(网络,augimdsValidation)进行分类;精度=平均值(YPred == imdsvalidation . label)
精度= 0.9000

显示与预测的标签和具有这些标签的图像的预测概率的四个采样的验证图像。

IDX = randperm(numel(imdsValidation.Files),4);数字I = 1:4副区(2,2,i)的I = readimage(imdsValidation,IDX(I));imshow(I)标记= YPred(IDX(I));标题(字符串(标签)+“”+ num2str(100 *马克斯(聚合氯化铝(idx(我),:)),3)+“%”);结束

参考

Szegedy, Christian, Wei Liu, Yangqing Jia, Pierre Sermanet, Scott Reed, Dragomir Anguelov, Dumitru Erhan, Vincent Vanhoucke, and Andrew Rabinovich。“用卷积做得更深。”在在IEEE会议计算机视觉和模式识别程序,第1-9。2015年。

也可以看看

||||||||||

相关话题