主要内容

使用预训练网络进行迁移学习

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

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

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

加载数据

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

解压缩(“MerchData.zip”);imd = imageDatastore (“MerchData”...“IncludeSubfolders”,真的,...“LabelSource”“foldernames”);

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

[imdsTrain, imdsValidation] = splitEachLabel (imd, 0.7,“随机”);

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

numTrainImages =元素个数(imdsTrain.Labels);idx = randperm (numTrainImages 16);数字i = 1:16 subplot(4,4,i) i = readimage(imdsTrain,idx(i));imshow(我)结束

负荷预训练网络

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

网= googlenet;

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

deepNetworkDesigner(净)

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

.InputSize inputSize = net.Layers (1)
inputSize =1×3224 224 3

取代最后一层

预训练网络的全连接层和分类层为1000个类配置。这两个层,loss3-classifier输出在GoogLeNet中,包含关于如何将网络提取的特征组合成类别概率、损失值和预测标签的信息。为了重新训练一个预先训练的网络来分类新的图像,将这两层替换为适应新数据集的新层。

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

lgraph = layerGraph(净);

将全连接层替换为新的全连接层,该层的输出数量等于类的数量。要使新层次的学习比转移层次的学习更快,就要增加WeightLearnRateFactorBiasLearnRateFactor完全连接层的值。

numClasses =元素个数(类别(imdsTrain.Labels))
numClasses = 5
newLearnableLayer = fullyConnectedLayer (numClasses,...“名字”“new_fc”...“WeightLearnRateFactor”10...“BiasLearnRateFactor”10);lgraph = replaceLayer (lgraph,“loss3-classifier”, newLearnableLayer);

分类层指定网络的输出类别。将分类层替换为一个没有类标签的新层。trainNetwork在训练时自动设置层的输出类。

newClassLayer = classificationLayer (“名字”“new_classoutput”);lgraph = replaceLayer (lgraph,“输出”, newClassLayer);

列车网络的

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

pixelRange = [-30 30];imageAugmenter = imageDataAugmenter (...“随机选择”,真的,...“RandXTranslation”pixelRange,...“RandYTranslation”, pixelRange);augimdsTrain = augmentedImageDatastore (inputSize (1:2), imdsTrain,...“DataAugmentation”, imageAugmenter);

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

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

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

选择= trainingOptions (“个”...“MiniBatchSize”10...“MaxEpochs”6....“InitialLearnRate”1的军医,...“洗牌”“every-epoch”...“ValidationData”augimdsValidation,...“验证频率”3,...“详细”假的,...“阴谋”“训练进步”);

训练由传输层和新层组成的网络。默认情况下,trainNetwork如果GPU可用,则使用GPU。这需要并行计算工具箱™和支持的GPU设备。万博1manbetx有关支持的设备的信息,请参见万博1manbetxGPU支万博1manbetx持情况(并行计算工具箱).否则,使用CPU。属性也可以指定执行环境“ExecutionEnvironment”的名称-值对参数trainingOptions

netTransfer = trainNetwork (augimdsTrain、lgraph选项);

验证图像进行分类

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

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

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

idx = randperm(元素个数(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] Szegedy, Christian, Liu Wei, Jia Yangqing, Pierre Sermanet, Scott Reed, Dragomir angelov, Dumitru Erhan, Vincent Vanhoucke和Andrew Rabinovich。“更深入的回旋。”计算机视觉与模式识别IEEE会议论文集(2015): 1 - 9。

另请参阅

|||||

相关话题