这个例子展示了如何微调一个预先训练的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(我)结束
加载预先训练的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);
通过用完全连接层、软最大层和分类输出层替换最后三层,将层转移到新的分类任务。根据新数据指定新的完全连接层的选项。将完全连接层设置为与新数据中的类数量相同的大小。要想在新的层次上比在转移的层次上学得更快,就要增加WeightLearnRateFactor
和BiasLearnRateFactor
完全连接层的值。
numClasses =元素个数(类别(imdsTrain.Labels))
numClasses = 5
layers = [layertransfer 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设备。金宝app有关支持的设备的信息,请参见金宝appGPU支金宝app持情况(并行计算工具箱).属性也可以指定执行环境“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
有关提高分类准确性的提示,请参见深度学习技巧.
[1] Krizhevsky, Alex, Ilya Sutskever和Geoffrey E. Hinton。基于深度卷积神经网络的图像网络分类神经信息处理系统的进展.2012.
[2]BVLC AlexNet模型.https://github.com/BVLC/caffe/tree/master/models/bvlc_alexnet
trainNetwork
|trainingOptions
|alexnet
|analyzeNetwork