主要内容

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

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

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

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

加载数据

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

解压缩(“MerchData.zip”);imds = imageDatastore(“MerchData”...“IncludeSubfolders”,真的,...“LabelSource”“foldernames”);[imdsTrain,imdsValidation] = splitEachLabel(imds,0.7);

负荷预训练网络

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

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

网=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]超参数DataAugmentation: 'none'归一化:'zerocenter' NormalizationDimension: 'auto' Mean: [224×224×3 single]
inputSize = net.Layers(1).InputSize;

更换最终图层

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

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

lgraph = layerGraph(net);

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

[learnableLayer,classLayer] = findLayersToReplace(lgraph);[learnableLayer, classLayer]
ans = 1×2带有层的层数组:1 'loss3-classifier'全连接1000全连接Layer 2 'output' Classification output crossentropyex与'tench'和999个其他类

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

numClasses = numel(categories(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层构成了网络的初始“主干”。使用支持函数金宝appfreezeWeights将前10层的学习率设置为零。使用支持函数金宝appcreateLgraphUsingConnections按原顺序重新连接所有层。新的层图包含相同的层,但早期层的学习率设置为零。

layers = lgraph.Layers;connections = loggraph . connections;layers(1:10) = freezeWeights(layers(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 = augmentedimagedastore (inputSize(1:2)),imdsTrain,...“DataAugmentation”, imageAugmenter);

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

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

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

指定要训练的epoch数。在执行迁移学习时,您不需要训练许多epoch。epoch是整个训练数据集上的一个完整的训练周期。指定小批大小和验证数据。每个epoch计算一次验证精度。

miniBatchSize = 10;valFrequency = floor(nummel (augimdsTrain.Files)/miniBatchSize);选项= trainingOptions(“个”...“MiniBatchSize”miniBatchSize,...“MaxEpochs”6...“InitialLearnRate”3的军医,...“洗牌”“every-epoch”...“ValidationData”augimdsValidation,...“ValidationFrequency”valFrequency,...“详细”假的,...“阴谋”“训练进步”);

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

net = trainNetwork(augimdsTrain,lgraph,options);

对验证图像进行分类

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

[YPred,probs] = category (net,augimdsValidation);accuracy = mean(YPred == imdsValidation.Labels)
准确度= 0.9000

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

idx = randperm(numel(imdsValidation.Files),4);数字i = 1:4 subplot(2,2,i) i = readimage(imdsValidation,idx(i));imshow(I) label = YPred(idx(I));标题(string(标签)+”、“+ num2str(100*max(probs(idx(i),:)),3) +“%”);结束

参考文献

[1]塞格迪,克里斯蒂安,刘伟,贾扬青,皮埃尔·塞尔曼内,斯科特·里德,德拉戈米尔·安格洛夫,杜米特鲁·埃尔汉,文森特·范豪克和安德鲁·拉宾诺维奇。“更深入地研究卷积。”在IEEE计算机视觉和模式识别会议论文集,第1-9页。2015.

另请参阅

|||||||||

相关的话题