主要内容

基于预训练网络的迁移学习

这个例子展示了如何微调预训练的GoogLeNet卷积神经网络,以便对新的图像集合进行分类。

GoogLeNet已经训练了超过100万幅图像,并可以将图像分类为1000个对象类别(如键盘、咖啡杯、铅笔和许多动物)。该网络学习了丰富的特征表示范围广泛的图像。该网络以一幅图像作为输入,输出图像中对象的标签以及每个对象类别的概率。

迁移学习通常用于深度学习应用。你可以用一个预先训练好的网络作为学习新任务的起点。用迁移学习对网络进行微调通常比用随机初始化权值从头开始训练网络更快、更容易。您可以使用少量的训练图像快速地将学习到的特征转移到新的任务中。

加载数据

将新图像解压缩并加载为图像数据存储。图像数据存储根据文件夹名称自动标记图像,并将数据存储为ImageDatastore对象。图像数据存储使您能够存储大的图像数据,包括内存中不适合的数据,并在卷积神经网络训练期间有效地读取批量图像。

解压缩(“MerchData.zip”);imds=图像数据存储(“MerchData”...“包含子文件夹”,真的,...“标签源”“foldernames”);

将数据划分为培训和验证数据集。70%的图像用于培训,30%用于验证。splitEachLabel将映像数据存储分割为两个新数据存储。

[imdsTrain,imdsValidation]=拆分每个标签(imds,0.7,“随机化”);

这个非常小的数据集现在包含55个训练图像和20个验证图像。显示一些示例图像。

numTrainImages=numel(imdsTrain.Labels);idx=randperm(numTrainImages,16);图i = 1:16 subplot(4,4,i) i = readimage(imdsTrain,idx(i));imshow(我)结束

负荷预训练网络

加载预先训练好的GoogLeNet神经网络。深度学习工具箱™模型GoogLeNet网络未安装,则该软件提供下载链接。

网= googlenet;

使用deepNetworkDesigner显示网络架构的交互式可视化和关于网络层的详细信息。

deepNetworkDesigner(net)

第一层是图像输入层,需要大小为224 × 224 × 3的输入图像,其中3是彩色通道的数量。

inputSize=net.Layers(1).inputSize
输入大小=1×3224 224 3

取代最后一层

预训练网络的全连通层和分类层配置了1000个类。这两个层,loss3-classifier输出在谷歌网中,包含有关如何将网络提取的特征组合成类别概率、损失值和预测标签的信息。要重新训练预训练网络以对新图像进行分类,请用适应新数据集的新层替换这两层。

从训练好的网络中提取层图。

lgraph=层图(净);

将完全连接的层替换为新的完全连接的层,该层的输出数量等于类的数量。要使新层中的学习速度快于转移层中的学习速度,请增加WeightLearnRateFactor双线性学习因子完全连接层的值。

numClasses =元素个数(类别(imdsTrain.Labels))
numClasses = 5
newLearnableLayer = fullyConnectedLayer (numClasses,...“名字”“new_fc”...“权重学习速率因子”10...“BiasLearnRateFactor”10);lgraph = replaceLayer (lgraph,“loss3-classifier”, newLearnableLayer);

分类层指定网络的输出类。用不带类标签的新分类层替换分类层。列车网络在训练时自动设置图层的输出类。

newClassLayer = classificationLayer (“名字”“new_classoutput”);lgraph=替换层(lgraph,“输出”,newClassLayer);

列车网络的

网络需要大小为224 × 224 × 3的输入图像,但是图像数据存储中的图像大小不同。使用扩充图像数据存储来自动调整训练图像的大小。指定要对训练图像执行的附加增强操作:沿着垂直轴随机翻转训练图像,并随机将它们水平和垂直平移至30像素。数据增强有助于防止网络过度拟合和记忆训练图像的确切细节。

pixelRange=[-30];imageAugmenter=imageDataAugmenter(...“随机选择”,真的,...“随机翻译”pixelRange,...“兰迪翻译”,像素范围);augimdsTrain=增强的图像数据存储(inputSize(1:2),imdsTrain,...“DataAugmentation”, imageAugmenter);

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

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

指定培训选项。对于转移学习,保留来自预训练网络早期层的特征(转移层权重)。要减缓转移层中的学习速度,请将初始学习速率设置为较小的值。在上一步中,您增加了完全连接层的学习速率系数,以加快新的最终层中的学习。这种学习速率设置的组合只会导致新层的快速学习和其他层的慢速学习。在执行迁移学习时,您不需要进行尽可能多的历次训练。历元是整个训练数据集上的完整训练周期。指定最小批量大小和验证数据。该软件每隔一天对网络进行验证ValidationFrequency迭代在训练。

选项=培训选项(“sgdm”...“MiniBatchSize”10...“MaxEpochs”6....“初始学习率”1的军医,...“洗牌”“每个时代”...“验证数据”,augimdsValidation,...“验证频率”3....“冗长”错误的...“阴谋”“训练进步”);

训练由传输层和新层组成的网络。默认情况下,列车网络如果GPU可用,则使用GPU。这需要并行计算工具箱™ 和支持的GPU设备。有关支持的设备的信息,请参阅金宝appGPU版金宝app本支持(并行计算工具箱).否则,使用CPU。属性也可以指定执行环境“ExecutionEnvironment”的名称-值对参数培训选项

netTransfer = trainNetwork (augimdsTrain、lgraph选项);

验证图像进行分类

使用微调网络对验证图像进行分类。

[YPred,分数]= (netTransfer augimdsValidation)进行分类;

显示四个样本验证图像与他们的预测标签。

idx=randperm(numel(imdsValidation.Files),4);图i=1:4子批次(2,2,i)i=readimage(imdsValidation,idx(i));imshow(I)label=YPred(idx(I));标题(字符串(标签));结束

计算验证集上的分类精度。精度是网络正确预测的标签分数。

YValidation=imdsValidation.Labels;精度=平均值(YPred==YValidation)
精度=1

有关提高分类准确性的提示,请参见深入学习技巧

工具书类

[1] Krizhevsky, Alex, Ilya Sutskever和Geoffrey E. Hinton。基于深度卷积神经网络的图像网络分类神经信息处理系统的进展25 (2012).

[2] 塞格迪、克里斯蒂安、刘伟、贾杨青、皮埃尔·塞尔马内、斯科特·里德、德拉戈米尔·安格洛夫、杜米特鲁·二汉、文森特·范霍克和安德鲁·拉比诺维奇。“用卷积深入。”IEEE计算机视觉和模式识别会议记录(2015): 1 - 9。

另请参阅

|||||

相关话题