使用AlexNet进行迁移学习
这个例子展示了如何微调预训练的AlexNet卷积神经网络,以对新的图像集合执行分类。
AlexNet已经对超过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(我)结束
负荷预训练网络
加载预先训练好的AlexNet神经网络。如果深度学习工具箱™模型用于AlexNet网络未安装时,则该软件提供下载链接。AlexNet对超过100万张图像进行了训练,可以将图像分为1000个对象类别,例如键盘、鼠标、铅笔和许多动物。因此,该模型已经学习了广泛图像的丰富特征表示。
Net = alexnet;
使用analyzeNetwork
显示网络体系结构的交互式可视化以及有关网络层的详细信息。
analyzeNetwork(净)
第一层是图像输入层,需要输入图像的大小为227 × 227 × 3,其中3是颜色通道的数量。
inputSize = net.Layers(1).InputSize
inputSize =1×3227 227 3
更换最终图层
预训练网络的最后三层网
配置为1000个类。对于新的分类问题,必须对这三个层进行微调。从预训练的网络中提取除最后三层外的所有层。
layersTransfer = net.Layers(1:end-3);
通过将最后三层替换为全连接层、softmax层和分类输出层,将这些层转移到新的分类任务中。根据新数据指定新的全连接层的选项。将全连接层设置为与新数据中的类数量相同的大小。为了在新层中比在转移层中更快地学习,增加WeightLearnRateFactor
而且BiasLearnRateFactor
全连接层的值。
numClasses = numel(categories(imdsTrain.Labels))
numClasses = 5
layers = [layersTransfer fullyConnectedLayer(numClasses,“WeightLearnRateFactor”, 20岁,“BiasLearnRateFactor”,20) softmaxLayer classificationLayer];
列车网络的
网络需要大小为227 × 227 × 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,否则使用CPU。在GPU上进行训练需要并行计算工具箱™和受支持的GPU设备。金宝app有关受支持设备的信息,请参见金宝appGPU支金宝app持版本(并行计算工具箱).属性指定执行环境“ExecutionEnvironment”
的名称-值对参数trainingOptions
.
netTransfer = trainNetwork(augimdsTrain,layers,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分类神经信息处理系统的进展.2012.
[2]BVLC AlexNet模型.https://github.com/BVLC/caffe/tree/master/models/bvlc_alexnet
另请参阅
trainNetwork
|trainingOptions
|alexnet
|analyzeNetwork