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