这个例子说明了如何使用迁移学习再培训卷积神经网络,一组新的图片进行分类。
预训练的图像分类网络已经培训了超过一万张图片,并可以将图像分为1000个对象的类别,如键盘,咖啡杯,铅笔,和许多动物。该网络已经学会了丰富的功能表示为各种图像。网络拍摄图像作为输入,并且然后输出一个标签与概率为每个对象类别的图像一起的对象。
迁移学习在深学习应用中常用的。你可以采取预训练网络,并以此为起点,学习新的任务。微调与迁移学习网络是比从头训练网络以随机初始化的权重通常更快,更容易。你可以学到功能迅速转移到使用训练图像的数少的新任务。
解压缩并加载新的图像作为图像数据存储。这非常小的数据集合中只有75图像。将数据分成训练和验证数据集。使用图像的70%用于训练和30%进行验证。
解压(“MerchData.zip”);imd = imageDatastore ('MerchData',...“IncludeSubfolders”,真正,...“LabelSource”,'foldernames');[imdsTrain,imdsValidation] = splitEachLabel(IMDS,0.7);
加载预训练GoogLeNet网络。如果深度学习工具箱™模式对于GoogLeNet网络金宝app支持包未安装,则软件提供下载链接。
尝试不同的预训练网络,打开MATLAB®这个例子中,选择不同的网络。例如,你可以试试squeezenet
,一个网络,甚至比快googlenet
。您可以使用其他预训练的网络运行此示例。有关所有可用网络的列表,请参见负载Pretrained网络。
网=googlenet;
使用analyzeNetwork
显示网络架构的交互式可视化和有关网络层的详细信息。
analyzeNetwork(净)
的第一元件图层
网络的属性是图像输入层。对于GoogLeNet网络中,该层需要尺寸224逐224×3,其中3是颜色通道的数量的输入图像。其他网络可能需要不同大小的输入图像。例如,Xception网络需要尺寸299逐299×3的图像。
net.Layers(1)
超参数数据扩充:‘none’归一化:‘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(净);结束
找了两个图层的名称来代替。为此,您可以手动,也可以使用支持功能金宝appfindLayersToReplace自动查找这些层。
[learnableLayer, classLayer] = findLayersToReplace (lgraph);[learnableLayer, classLayer]
ANS = 1×2层阵列层:1“loss3分类器”完全连接1000完全连接层2“输出”分类输出crossentropyex与“丁鲷”等999类
在大多数网络中,具有可学习权值的最后一层是完全连接的层。将这个全连接层替换为一个新的全连接层,输出的数量等于新数据集中的类的数量(本例中为5个)。在一些网络中,例如SqueezeNet,最后一个可学习的层是一个1乘1的卷积层。在这种情况下,将convolutional layer替换为convolutional layer, filter的数目等于classes的数目。为了在新层中比在转移层中学习得更快,增加该层的学习速率因子。
numClasses = numel(类别(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重新连接在原订单中的所有图层。新层图包含同一层,但设置为零较早层的学习率。
层= 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
到一个小的值,以减缓学习的层次转移,而不是已经冻结。在前面的步骤中,您增加了最后一个可学习层的学习速率因子,以加速新最后一层的学习。这种学习速率设置的组合导致在新层中快速学习,在中间层中较慢的学习,而在较早的冻结层中没有学习。
指定要练个时期的数量。当执行迁移学习,你不需要火车尽可能多的时期。一个时代是整个训练数据集完整的训练周期。指定小批量大小和验证数据。计算验证准确性每时期一次。
miniBatchSize = 10;valFrequency =地板(元素个数(augimdsTrain.Files) / miniBatchSize);选择= trainingOptions ('SGDM',...'MiniBatchSize',miniBatchSize,...'MaxEpochs'6...'InitialLearnRate',3E-4,...“洗牌”,“every-epoch”,...“ValidationData”,augimdsValidation,...“ValidationFrequency”,valFrequency,...“放牧”假的,...“情节”,“训练进度”);
使用培训训练数据网络。默认情况下,trainNetwork
使用GPU(如果可用)(需要并行计算工具箱™和启用CUDA®GPU计算能力3.0或更高版本)。除此以外,trainNetwork
使用一个CPU。还可以使用。来指定执行环境“执行环境”
的名-值对参数trainingOptions
。由于数据集是如此之小,训练快。
网= trainNetwork (augimdsTrain、lgraph选项);
分类使用微调网络验证的图像,并计算出分类精度。
[YPred,probs] =分类(净,augimdsValidation);精度=平均值(YPred == imdsValidation.Labels)
精度= 0.9000
显示与预测的标签和具有这些标签的图像的预测概率的四个采样的验证图像。
idx = randperm(元素个数(imdsValidation.Files), 4);数字对于I = 1:4副区(2,2,i)的I = readimage(imdsValidation,IDX(I));imshow(I)标记= YPred(IDX(I));标题(字符串(标签)+", "+ num2str(100 *最大(probs(IDX(ⅰ),:)),3)+“%”);结束
[1] Szegedy,基督教,刘伟,杨清嘉,皮埃尔Sermanet,斯科特·里德,德拉戈米尔Anguelov先生,杜米特鲁埃尔汗,文森特Vanhoucke和安德鲁·拉比诺维奇。“要和回旋更深。”在IEEE计算机视觉和模式识别会议记录1 - 9页。2015.
[2]BVLC GoogLeNet型号。https://github.com/BVLC/caffe/tree/master/models/bvlc_googlenet
DAGNetwork
|alexnet
|analyzeNetwork
|googlenet
|importCaffeLayers
|importCaffeNetwork
|layerGraph
|情节
|trainNetwork
|vgg16
|vgg19