使用预训练网络的迁移学习
这个例子展示了如何微调预先训练的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(我)结束
负载Pretrained网络
加载预先训练的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(净);
用一个新的完全连接层替换完全连接层,该层的输出数量等于类的数量。要使新层中的学习速度比已传输层中的更快,请增加WeightLearnRateFactor
而且BiasLearnRateFactor
全连通层的值。
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 (...“RandXReflection”,真的,...“RandXTranslation”pixelRange,...“RandYTranslation”, pixelRange);augimdsTrain = augmentedImageDatastore (inputSize (1:2), imdsTrain,...“DataAugmentation”, imageAugmenter);
若要自动调整验证图像的大小而不执行进一步的数据增强,请使用增强图像数据存储而不指定任何额外的预处理操作。
augimdsValidation = augmentedImageDatastore (inputSize (1:2), imdsValidation);
指定培训选项。对于转移学习,保留预训练网络早期层的特征(转移层权值)。为了降低迁移层的学习速度,可以将初始学习率设置为较小的值。在前面的步骤中,您增加了全连接层的学习率因子,以加快新的最终层中的学习。这种学习率设置的组合导致只在新层中实现快速学习,而在其他层中实现较慢学习。在执行迁移学习时,您不需要训练那么多课时。一个epoch是整个训练数据集上的一个完整的训练周期。指定小批大小和验证数据。该软件每天验证网络ValidationFrequency
迭代在训练。
选择= trainingOptions (“个”,...“MiniBatchSize”10...“MaxEpochs”6...“InitialLearnRate”1的军医,...“洗牌”,“every-epoch”,...“ValidationData”augimdsValidation,...“ValidationFrequency”3,...“详细”假的,...“阴谋”,“训练进步”);
训练由迁移层和新层组成的网络。默认情况下,trainNetwork
如果有图形处理器,使用图形处理器。这需要并行计算工具箱™和支持的GPU设备。有关支持的设备的信息,请参见GPU计算的需求(并行计算工具箱).否则,它使用CPU。方法还可以指定执行环境“ExecutionEnvironment”
的名值对参数trainingOptions
.
netTransfer = trainNetwork (augimdsTrain、lgraph选项);
验证图像进行分类
使用微调网络对验证图像进行分类。
[YPred,分数]= (netTransfer augimdsValidation)进行分类;
显示四个带有预测标签的样本验证图像。
idx = randperm(元素个数(imdsValidation.Files), 4);数字为i = 1:4 subplot(2,2,i) i = readimage(imdsValidation,idx(i));imshow(I) label = YPred(idx(I));标题(字符串(标签));结束
计算验证集上的分类精度。准确性是网络正确预测的标签的比例。
YValidation = imdsValidation.Labels;精度=平均值(YPred == YValidation)
精度= 1
有关提高分类准确性的提示,请参见深度学习技巧.
参考文献
Krizhevsky, Alex, Ilya Sutskever和Geoffrey E. Hinton。用深度卷积神经网络对ImageNet进行分类。神经信息处理系统的进展25(2012)。
[2] Szegedy, Christian,刘伟,贾扬青,Pierre Sermanet, Scott Reed, Dragomir angelov, Dumitru Erhan, Vincent Vanhoucke和Andrew Rabinovich。“更深入地研究卷积。”IEEE计算机视觉和模式识别会议论文集(2015): 1 - 9。
[3]“BVLC GoogLeNet模型。”https://github.com/BVLC/caffe/tree/master/models/bvlc_googlenet.
另请参阅
trainNetwork
|trainingOptions
|squeezenet
|googlenet
|analyzeNetwork
|深层网络设计师