使用预训练网络的迁移学习
这个例子展示了如何微调一个预先训练好的GoogLeNet卷积神经网络来对一组新的图像进行分类。
GoogLeNet已经在超过100万张图像上进行了训练,可以将图像分为1000个对象类别(例如键盘、咖啡杯、铅笔和许多动物)。该网络已经为广泛的图像学习了丰富的特征表示。该网络将图像作为输入,并输出图像中对象的标签以及每个对象类别的概率。
迁移学习是深度学习应用中常用的一种方法。你可以使用预先训练好的网络,并将其作为学习新任务的起点。用迁移学习对网络进行微调通常比用随机初始化的权重从头训练网络更快更容易。您可以使用较少的训练图像快速将学习到的特征转移到新任务中。
加载数据
解压缩并将新映像加载为映像数据存储。imageDatastore
根据文件夹名称自动标记图像,并将数据存储为ImageDatastore
对象。图像数据存储使您能够存储大量图像数据,包括不适合内存的数据,并在卷积神经网络训练期间有效地读取批量图像。
解压缩(“MerchData.zip”);imds = imageDatastore(“MerchData”,...“IncludeSubfolders”,真的,...“LabelSource”,“foldernames”);
将数据分为训练数据集和验证数据集。使用70%的图像进行训练,30%用于验证。splitEachLabel
将映像数据存储拆分为两个新的数据存储。
[imdsTrain,imdsValidation] = splitEachLabel(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网络未安装时,则该软件提供下载链接。
Net = googlenet;
使用deepNetworkDesigner
显示网络体系结构的交互式可视化以及有关网络层的详细信息。
deepNetworkDesigner(净)
第一层是图像输入层,需要输入图像的大小为224 × 224 × 3,其中3是颜色通道的数量。
inputSize = net.Layers(1).InputSize
inputSize =1×3224 224 3
更换最终图层
预训练网络的全连接层和分类层网
配置为1000个类。这两层,loss3-classifier
而且输出
在GoogLeNet中,包含关于如何将网络提取的特征组合成类概率、损失值和预测标签的信息。为了重新训练一个预先训练好的网络来分类新图像,用适应新数据集的新层替换这两个层。
从训练好的网络中提取层图。
lgraph = layerGraph(net);
将全连接层替换为一个新的全连接层,该层的输出数量等于类的数量。为了使新层中的学习速度快于转移层,可以增加WeightLearnRateFactor
而且BiasLearnRateFactor
全连接层的值。
numClasses = numel(categories(imdsTrain.Labels))
numClasses = 5
newLearnableLayer = fullyConnectedLayer(numClasses,...“名字”,“new_fc”,...“WeightLearnRateFactor”10...“BiasLearnRateFactor”10);lgraph =替换层(lgraph,“loss3-classifier”, newLearnableLayer);
分类层指定网络的输出类。用一个没有类标签的新层替换分类层。trainNetwork
在训练时自动设置层的输出类。
newClassLayer = classificationLayer(“名字”,“new_classoutput”);lgraph =替换层(lgraph,“输出”, newClassLayer);
列车网络的
网络需要大小为224 × 224 × 3的输入映像,但是映像数据存储中的映像具有不同的大小。使用增强图像数据存储来自动调整训练图像的大小。指定要对训练图像执行的附加增强操作:沿着垂直轴随机翻转训练图像,并在水平和垂直方向上随机将它们平移到30像素。数据增强有助于防止网络过度拟合和记忆训练图像的确切细节。
pixelRange = [-30 30];imageAugmenter = imageDataAugmenter(...“RandXReflection”,真的,...“RandXTranslation”pixelRange,...“RandYTranslation”, pixelRange);augimdsTrain = augmentedimagedastore (inputSize(1:2)),imdsTrain,...“DataAugmentation”, imageAugmenter);
若要自动调整验证图像的大小,而不执行进一步的数据增强,请使用增强图像数据存储,而不指定任何额外的预处理操作。
augimdsValidation = augmentedImageDatastore(inputSize(1:2),imdsValidation);
指定培训选项。对于迁移学习,保留预训练网络早期层的特征(转移层权重)。为了降低迁移层的学习速度,可以将初始学习率设置为较小的值。在前面的步骤中,您增加了全连接层的学习率因子,以加快新的最终层的学习速度。这种学习率设置的组合导致只在新层中快速学习,而在其他层中学习较慢。在执行迁移学习时,您不需要训练许多epoch。epoch是整个训练数据集上的一个完整的训练周期。指定小批大小和验证数据。该软件验证网络每ValidationFrequency
训练期间的迭代。
选项= trainingOptions(“个”,...“MiniBatchSize”10...“MaxEpochs”6...“InitialLearnRate”1的军医,...“洗牌”,“every-epoch”,...“ValidationData”augimdsValidation,...“ValidationFrequency”3,...“详细”假的,...“阴谋”,“训练进步”);
训练由转移层和新层组成的网络。默认情况下,trainNetwork
使用GPU(如果有的话)。这需要并行计算工具箱™和受支持的GPU设备。金宝app有关受支持设备的信息,请参见金宝appGPU计算要求(并行计算工具箱).否则,它使用CPU。属性指定执行环境“ExecutionEnvironment”
的名称-值对参数trainingOptions
.
netTransfer = trainNetwork(augimdsTrain,lgraph,options);
对验证图像进行分类
利用优化后的网络对验证图像进行分类。
[YPred,scores] = category (netTransfer,augimdsValidation);
显示四个样本验证图像及其预测标签。
idx = randperm(numel(imdsValidation.Files),4);数字为i = 1:4 subplot(2,2,i) i = readimage(imdsValidation,idx(i));imshow(I) label = YPred(idx(I));标题(字符串(标签));结束
计算验证集上的分类精度。准确率是网络正确预测的标签的比例。
YValidation = imdsValidation.Labels;accuracy = mean(YPred == YValidation)
准确度= 1
有关提高分类准确性的提示,请参见深度学习技巧和技巧.
参考文献
[1] Krizhevsky, Alex, Ilya Sutskever和Geoffrey E. Hinton。深度卷积神经网络的ImageNet分类神经信息处理系统的进展25(2012)。
[2]塞格迪,克里斯蒂安,刘伟,贾扬青,皮埃尔·塞尔曼内,斯科特·里德,德拉戈米尔·安格洛夫,杜米特鲁·埃尔汉,文森特·范豪克和安德鲁·拉宾诺维奇。“更深入地研究卷积。”IEEE计算机视觉和模式识别会议论文集(2015): 1 - 9。
[3]“BVLC GoogLeNet模型。”https://github.com/BVLC/caffe/tree/master/models/bvlc_googlenet.
另请参阅
trainNetwork
|trainingOptions
|squeezenet
|googlenet
|analyzeNetwork
|深度网络设计器