主要内容

使用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
[layertransfer fullyConnectedLayer(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设备。万博1manbetx有关支持的设备的信息,请参见万博1manbetxGPU支万博1manbetx持版本(并行计算工具箱).您还可以使用使用指定执行环境'executionenvironment'的名称-值对参数trainingOptions

nettransfer = trainnetwork(augimdstrain,图层,选项);

分类验证映像

使用微调网络对验证图像进行分类。

[ypred,scores] =分类(nettransfer,augimdsvalidation);

显示具有预测标签的四个样本验证图像。

idx = randperm(元素个数(imdsValidation.Files), 4);数字为了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

也可以看看

|||

相关的话题