这个例子展示了如何使用迁移学习来重新训练卷积神经网络来对一组新的图像进行分类。
经过预先训练的图像分类网络已经在100多万幅图像上进行了训练,可以将图像分为1000个对象类别,如键盘、咖啡杯、铅笔和许多动物。网络学习了丰富的特征表示范围广泛的图像。该网络以一幅图像作为输入,然后输出图像中对象的标签以及每个对象类别的概率。
迁移学习通常用于深度学习应用。你可以用一个预先训练好的网络作为学习新任务的起点。使用迁移学习对网络进行微调,通常比使用随机初始化的权值从头开始训练网络更快、更容易。您可以使用少量的训练图像快速地将学习到的特征转移到新的任务中。
将新图像解压并作为图像数据存储加载。这个非常小的数据集只包含75张图像。将数据分为训练数据集和验证数据集。使用70%的图像进行训练,30%的图像进行验证。
解压缩(“MerchData.zip”); imds=图像数据存储(“MerchData”,...“包含子文件夹”,真的,...“标签源”,“foldernames”);[imdsTrain, imdsValidation] = splitEachLabel (imd, 0.7);
加载一个预先训练好的GoogLeNet网络。如果深度学习工具箱™模型GoogLeNet网络金宝app未安装支持包,则软件提供下载链接。
为了尝试一个不同的预训练网络,在MATLAB®中打开这个示例并选择一个不同的网络。例如,你可以试试squeezenet
,这个网络甚至比googlenet
。您可以使用其他预训练网络运行此示例。有关所有可用网络的列表,请参阅负荷预训练网络.
网=谷格伦;
使用analyzeNetwork
显示网络架构的交互式可视化和关于网络层的详细信息。
分析网络(net)
第一个元素层
网络的属性是图像的输入层。对于GoogLeNet网络,这一层需要输入尺寸为224 × 224 × 3的图像,其中3是彩色通道的数量。其他网络可能需要不同大小的输入图像。例如,Xception网络需要大小为299 × 299 × 3的图像。
net.Layers (1)
ans=ImageInputLayer,具有以下属性:名称:'data'InputSize:[224 224 3]超参数数据增强:'none'规格化:'zerocenter'规格化维度:'auto'平均值:[224×224×3 single]
inputSize = net.Layers (1) .InputSize;
网络的卷积层提取图像特征,最后一个可学习层和最后一个分类层用来对输入图像进行分类。这两个层,“loss3-classifier”
和“输出”
在谷歌网中,包含有关如何将网络提取的特征组合成类别概率、损失值和预测标签的信息。要重新训练预训练网络以对新图像进行分类,请用适应新数据集的新层替换这两层。
将训练过的网络转换为层图。
lgraph=层图(净);
找到要替换的两个层的名称。您可以手动执行此操作,也可以使用支持功能金宝appfindLayersToReplace自动查找这些图层。
[learnableLayer,classLayer]=FindLayerStore(lgraph);[可学习层,类层]
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=fullyConnectedLayer(NumClass,...“名字”,“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层构成了网络最初的“主干”。使用支持函数金宝app冷冻砝码将前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 (...“随机选择”,真的,...“RandXTranslation”pixelRange,...“RandYTranslation”pixelRange,...“RandXScale”scaleRange,...“RandYScale”, scaleRange);augimdsTrain = augmentedImageDatastore (inputSize (1:2), imdsTrain,...“DataAugmentation”, imageAugmenter);
若要自动调整验证图像的大小而不执行进一步的数据扩展,请使用扩展后的图像数据存储,而不指定任何额外的预处理操作。
augimdsValidation = augmentedImageDatastore (inputSize (1:2), imdsValidation);
指定培训选项。集InitialLearnRate
在一个小的值中减慢在未被冻结的传输层中的学习。在前一步骤中,你增加了最后一个可学习层的学习速率因子,以加速在新的最终层中的学习。这种学习速率设置的组合导致新层中的快速学习,在中间L中学习较慢。是的,在早期的冻结层中没有学习。
指定要训练的纪元数。当进行迁移学习时,你不需要训练那么多的纪元。epoch是整个训练数据集上的一个完整的训练周期。指定小批量大小和验证数据。每个epoch计算一次验证精度。
miniBatchSize=10;valFrequency=floor(numel(augimdsTrain.Files)/miniBatchSize);options=trainingOptions(“个”,...“MiniBatchSize”miniBatchSize,...“MaxEpochs”6....“InitialLearnRate”3的军医,...“洗牌”,“每个时代”,...“验证数据”augimdsValidation,...“验证频率”valFrequency,...“详细”错误的...“阴谋”,“训练进步”);
使用训练数据对网络进行训练。默认情况下,trainNetwork
如果GPU可用,则使用GPU。这需要并行计算工具箱™和支持的GPU设备。金宝app有关支持的设备的信息,请参见金宝appGPU支金宝app持情况(并行计算工具箱)否则trainNetwork
使用CPU。您还可以使用“ExecutionEnvironment”
的名称-值对参数培训选项
.因为数据集很小,所以训练速度很快。
net=列车网络(augimdsTrain、lgraph、选项);
利用微调网络对验证图像进行分类,并计算分类精度。
(YPred,聚合氯化铝)=(网络,augimdsValidation)进行分类;精度= mean(YPred == imdsvalidate . 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 *马克斯(聚合氯化铝(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
|阿列克斯内特
|importCaffeNetwork
|importCaffeLayers
|trainNetwork
|分层图
|DAGNetwork
|googlenet
|analyzeNetwork