主要内容

使用AlexNet进行迁移学习

这个例子展示了如何微调一个预先训练的AlexNet卷积神经网络来对一个新的图像集合进行分类。

AlexNet已经对超过100万张图片进行了训练,并可以将图片分类为1000个对象类别(如键盘、咖啡杯、铅笔和许多动物)。该网络学习了丰富的特征表示范围广泛的图像。该网络以一幅图像作为输入,输出图像中对象的标签以及每个对象类别的概率。

转移学习通常用于深入学习应用。您可以拍摄备用网络并将其用作学习新任务的起点。微调具有传输学习的网络通常比训练网络从头开始随机初始化的权重更快更容易。您可以使用较少数量的培训图像快速将学习功能转移到新任务。

加载数据

将新图像解压并作为图像数据存储加载。imageDatastore自动标签的图像基于文件夹名称和存储数据作为imageageAtastore.目的。映像数据存储使您能够存储大图像数据,包括不适合内存的数据,并在卷积神经网络的训练期间有效地读取批次图像。

解压缩(“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子图(4,4,i)i = ReadImage(IMDstrain,IDX(I));imshow(i)结尾

负载Pretrained网络

加载预先训练的AlexNet神经网络。深度学习工具箱™模型AlexNet网络未安装,然后软件提供下载链接。AlexNet培训超过一百万图像,可以将图像分为1000个对象类别,例如键盘,鼠标,铅笔和许多动物。因此,该模型已经学习了丰富的特征表示,以获得各种图像。

网= alexnet;

使用analyzeNetwork显示网络架构的交互式可视化和有关网络层的详细信息。

analyzeNetwork(净)

第一层,图像输入层需要输入尺寸227-×227-×3的输入图像,其中3是颜色信道的数量。

.InputSize inputSize = net.Layers (1)
inputSize =1×3.227 227 3.

替换最终图层

预训练网络的最后三层为1000个类配置。这三层必须针对新的分类问题进行微调。从预先训练的网络中提取除最后三层外的所有层。

Layerstransfer = Net.Layers(1:END-3);

通过用完全连接的图层,Softmax层和分类输出层替换最后三层来将图层传送到新的分类任务。根据新数据指定新的完全连接图层的选项。将完全连接的图层设置为具有与新数据中的类的数量相同的大小。在新层中学习比转移层更快,增加了举重BiasLearnRateFactor完全连接层的值。

numclasses = numel(类别(imdstrain.labels))
numclasses = 5
layers = [layertransfer fulllyconnectedlayer (numClasses,“WeightLearnRateFactor”20,'biaslearnratefactor',20)SoftmaxLayer分类层];

火车网络

该网络需要输入大小227-×227-3的图像,但图像数据存储中的图像具有不同的大小。使用增强图像数据存储来自动调整培训图像的大小。指定额外的增强操作以在训练图像上执行:随机翻转沿垂直轴的训练图像,并随机将其水平和垂直多达30个像素转换。数据增强有助于防止网络过度接收和记忆培训图像的确切细节。

pixelRange = [-30 30];imageAugmenter = imageDataAugmenter (......“RandXReflection”,真的,......“RandXTranslation”,pixelrange,......“RandYTranslation”, pixelRange);augimdsTrain = augmentedImageDatastore (inputSize (1:2), imdsTrain,......'dataaugmentation',imageaugmender);

若要自动调整验证图像的大小而不执行进一步的数据扩展,请使用扩展后的图像数据存储,而不指定任何额外的预处理操作。

augimdsvalidation = augmentedimagedataStore(输入(1:2),IMDSValidation);

指定培训选项。对于迁移学习,保留预先训练网络的早期层的特征(迁移层权值)。为了降低传输层的学习速度,将初始学习率设置为一个较小的值。在前面的步骤中,您增加了完全连接层的学习率因素,以加速新的最后层的学习。这种学习率设置的组合只会导致在新层中学习快,而在其他层中学习慢。当进行迁移学习时,你不需要训练那么多的纪元。epoch是整个训练数据集上的一个完整的训练周期。指定小批量大小和验证数据。软件每次都要对网络进行验证验证频繁培训期间的迭代。

选择= trainingOptions (“个”......'minibatchsize'10,......'maxepochs'6......“InitialLearnRate”,1e-4,......“洗牌”“every-epoch”......“ValidationData”augimdsValidation,......“ValidationFrequency”3,......“详细”假的,......'plots''培训 - 进步');

培训由转移和新层组成的网络。默认情况下,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

也可以看看

|||

相关的话题