这个例子展示了如何使用迁移学习来重新训练卷积神经网络来对一组新的图像进行分类。
经过预先训练的图像分类网络已经在100多万幅图像上进行了训练,可以将图像分为1000个对象类别,如键盘、咖啡杯、铅笔和许多动物。网络学习了丰富的特征表示范围广泛的图像。该网络以一幅图像作为输入,然后输出图像中对象的标签以及每个对象类别的概率。
迁移学习通常用于深度学习应用。你可以用一个预先训练好的网络作为学习新任务的起点。使用迁移学习对网络进行微调,通常比使用随机初始化的权值从头开始训练网络更快、更容易。您可以使用少量的训练图像快速地将学习到的特征转移到新的任务中。
将新图像解压并作为图像数据存储加载。这个非常小的数据集只包含75张图像。将数据分为训练数据集和验证数据集。使用70%的图像进行训练,30%的图像进行验证。
解压缩(“MerchData.zip”);imd = imageDatastore (“MerchData”,...“IncludeSubfolders”,真的,...“LabelSource”,“foldernames”);[imdsTrain, imdsValidation] = splitEachLabel (imd, 0.7);
加载一个预先训练好的GoogLeNet网络。如果深度学习工具箱™模型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-classifier”
和“输出”
在GoogLeNet中,包含关于如何将网络提取的特征组合成类别概率、损失值和预测标签的信息。为了重新训练一个预先训练的网络来分类新的图像,将这两层替换为适应新数据集的新层。
将训练过的网络转换为层图。
lgraph = layerGraph(净);
找到要替换的两个层的名称。您可以手动执行此操作,也可以使用支持功能金宝appfindLayersToReplace自动查找这些层。
[learnableLayer, classLayer] = findLayersToReplace (lgraph);[learnableLayer, classLayer]
ans = 1×2 Layer array with layers: 1 'loss3-classifier' Fully Connected 1000 Fully Connected Layer 2 'output' Classification output crossentropyex with 'tench' and 999 other classes
在大多数网络中,具有可学习权值的最后一层是完全连接层。将这个完全连接层替换为一个新的完全连接层,输出的数量等于新数据集中的类的数量(本例中为5)。在一些网络中,比如SqueezeNet,最后的可学习层是一个1乘1的卷积层。在这种情况下,将卷积层替换为一个新的卷积层,该卷积层的过滤器数量等于类的数量。为了在新层中比在转移层中学习得更快,增加该层的学习率因子。
numClasses =元素个数(类别(imdsTrain.Labels));如果isa (learnableLayer“nnet.cnn.layer.FullyConnectedLayer”newLearnableLayer = fullconnectedlayer (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按原顺序重新连接所有层。新的层图包含相同的层,但先前层的学习率设为零。
层= 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 =地板(元素个数(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。属性也可以指定执行环境“ExecutionEnvironment”
的名称-值对参数trainingOptions
.因为数据集很小,所以训练速度很快。
网= trainNetwork (augimdsTrain、lgraph选项);
利用微调网络对验证图像进行分类,并计算分类精度。
(YPred,聚合氯化铝)=(网络,augimdsValidation)进行分类;精度= mean(YPred == imdsvalidate . labels)
精度= 0.9000
显示四张带有预测标签的样本验证图像以及具有这些标签的图像的预测概率。
idx = randperm(元素个数(imdsValidation.Files), 4);数字为i = 1:4 subplot(2,2,i) i = readimage(imdsValidation,idx(i));imshow(I) label = YPred(idx(I));标题(string(标签)+”、“+ 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.
[2]BVLC GoogLeNet模型.https://github.com/BVLC/caffe/tree/master/models/bvlc_googlenet
vgg16
|vgg19
|alexnet
|importCaffeNetwork
|importCaffeLayers
|trainNetwork
|layerGraph
|DAGNetwork
|googlenet
|analyzeNetwork