此示例显示了如何微调预折叠的亚历纳特卷积神经网络,以对新的图像集合进行分类。
AlexNet已培训超过一百万只图像,可以将图像分类为1000个对象类别(例如键盘,咖啡杯,铅笔和许多动物)。该网络已经学习了丰富的特征表示,以获得各种图像。该网络将图像作为输入,将图像中的对象的标签与每个对象类别的概率一起输出。
迁移学习是深度学习应用中常用的方法。您可以使用一个预先训练过的网络,并将其作为学习新任务的起点。使用迁移学习对网络进行微调通常比从头开始使用随机初始化权值训练网络要快得多,也容易得多。你可以使用较少数量的训练图像快速地将学习到的特征转移到新的任务中。
解压缩并将新图像加载为图像数据存储。imageageAtastore.
根据文件夹名称自动标记图像并将数据存储为ImageDatastore
对象。图像数据存储使您能够存储大型图像数据,包括不能装入内存的数据,并在卷积神经网络训练期间有效地读取成批图像。
解压缩('merchdata.zip');imds = imageageatastore(“MerchData”,…'insertumbfolders',真的,…'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训练了100多万幅图像,可以将图像分类为1000种物体类别,如键盘、鼠标、铅笔和许多动物。结果,该模型已经学习到丰富的特征表示的广泛的图像。
net = alexnet;
使用分析
显示网络架构的交互式可视化和有关网络层的详细信息。
分析(净)
第一层是图像输入层,需要输入的图像尺寸为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 =元素个数(类别(imdsTrain.Labels))
numClasses = 5
图层= [TALERSTRANSFER全连接层(NUMCLASS,'wexerlearnratefactor', 20岁,“BiasLearnRateFactor”, 20) softmaxLayer classificationLayer];
网络需要输入大小为227 × 227 × 3的图像,但是图像数据存储中的图像大小不同。使用增强图像数据存储来自动调整训练图像的大小。指定要对训练图像执行的额外的增强操作:沿着垂直轴随机翻转训练图像,并在水平和垂直方向随机将它们平移到30个像素。数据增强有助于防止网络过度拟合和记忆训练图像的确切细节。
PIXELRANGE = [-30 30];imageaugmenter = imagedataAugmenter(…'randxreflection',真的,…'randxtranslation'pixelRange,…'randytranslation',pixelrange);Augimdstrain = AugmentedimageGedataStore(Inputsize(1:2),IMDstrain,…“DataAugmentation”, imageAugmenter);
要自动调整验证图像的大小而不执行进一步的数据增强,请使用增强图像数据存储,而无需指定任何其他预处理操作。
augimdsValidation = augmentedImageDatastore (inputSize (1:2), imdsValidation);
指定培训选项。对于转移学习,将特征与预磨料网络的早期层保持(转移的层重量)保持。为了减慢转移层的学习,将初始学习率设置为小值。在上一步中,您可以增加完全连接层的学习率因子,以加速新的最终层的学习。这种学习速率设置的组合只会在新层次中快速学习,并在其他层中的学习较慢。在进行转移学习时,您不需要为尽可能多的时期训练。epoch是整个培训数据集的完整培训周期。指定迷你批量大小和验证数据。该软件每个都验证网络ValidationFrequency
迭代在训练。
选项=培训选项('sgdm',…“MiniBatchSize”10…“MaxEpochs”,6,…'italllearnrate'1的军医,…'洗牌','每个时代',…'vightationdata',augimdsvalidation,…'验证职业',3,…'verbose',错误的,…“阴谋”,“训练进步”);
训练由传输层和新层组成的网络。默认情况下,Trainnetwork.
使用GPU,如果有一个可用的(需要并行计算工具箱™和CUDA®启用的GPU,则具有计算能力3.0或更高版本)。否则,它使用CPU。您还可以使用使用指定执行环境“ExecutionEnvironment”
名称 - 值对参数培训选项
。
netTransfer = trainNetwork (augimdsTrain层,选项);
使用经过微调的网络对验证图像进行分类。
[YPred,分数]= (netTransfer augimdsValidation)进行分类;
显示四个带有预测标签的示例验证图像。
idx = randperm(numel(imdsvalidation.files),4);数字为i = 1:4子图(2,2,i)i = ReadImage(IMDSValidation,IDX(i));imshow(i)标签= 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.
AlexNet.
|分析
|培训选项
|Trainnetwork.