此示例显示了如何微调预磨损的Googlenet卷积神经网络,以对新的图像集合进行分类。
GoogLeNet已经训练了超过100万幅图像,并可以将图像分类为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(我)结束
加载预先训练好的GoogLeNet神经网络。深度学习工具箱™模型GoogLeNet网络未安装,则该软件提供下载链接。
网= googlenet;
采用deepNetworkDesigner
显示网络架构的交互式可视化和关于网络层的详细信息。
DeepNetWorkDesigner(网)
第一层是图像输入层,需要大小为224 × 224 × 3的输入图像,其中3是彩色通道的数量。
InputSize = Net.Layers(1).InputSize
InputSize =1×3224 224 3
预先连接的网络和普拉维尔网络的分类层网
配置为1000类。这两层,loss3-classifier
和输出
在Googlenet中,包含有关如何将网络提取到类概率,丢失值和预测标签组合的功能的信息。要重新培训备用网络以对新图像进行分类,请将这两层替换为适合新数据集的新图层。
从训练网络中提取图层图。
Lgraph = LayerGraph(网);
用新的完全连接的图层替换完全连接的图层,该层具有等于类数的输出数。在新层中比转移层更快地学习,增加WeightLearnRateFactor
和Biaslearnratefactor.
完全连接层的值。
numClasses =元素个数(类别(imdsTrain.Labels))
numClasses = 5
newLearnableLayer = fullyConnectedLayer (numClasses,...“名字”,“new_fc”,...'wexerlearnratefactor'10...“BiasLearnRateFactor”10);lgraph = replaceLayer (lgraph,“loss3-classifier”, newLearnableLayer);
分类层指定网络的输出类。用没有类标签的新一个替换分类层。Trainnetwork.
在培训时间自动设置图层的输出类。
newClassLayer = classificationLayer (“名字”,“new_classoutput”);lgraph = replaceLayer (lgraph,“输出”,newclasslayer);
网络需要大小为224 × 224 × 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,...“ValidationFrequency”,3,...'verbose',错误的,...“阴谋”,“训练进步”);
培训由转移和新层组成的网络。默认情况下,Trainnetwork.
如果有一个可用的,则使用GPU。这需要并行计算工具箱™和支持的GPU设备。万博1manbetx有关支持设备的信息,请参阅万博1manbetxGPU通万博1manbetx过发布支持(并行计算工具箱).否则,使用CPU。属性也可以指定执行环境“ExecutionEnvironment”
名称 - 值对参数培训选项
.
netTransfer = trainNetwork (augimdsTrain、lgraph选项);
使用微调网络对验证图像进行分类。
[YPred,分数]= (netTransfer augimdsValidation)进行分类;
显示四个样本验证图像与他们的预测标签。
idx = randperm(numel(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。基于深度卷积神经网络的图像网络分类神经信息处理系统的进展25(2012)。
[2] Szegedy,Christian,Wei Liu,Yangqing Jia,Pierre Sermanet,斯科特芦苇,龙卷风犬,Dumitru Erhan,Vincent Vanhoucke,以及安德鲁拉比诺维奇。“随着卷积更深。”计算机愿景和模式识别的IEEE会议的诉讼程序(2015): 1 - 9。
[3]“BVLC谷歌网络模型。”https://github.com/bvlc/caffe/tree/master/models/bvlc_googlenet..
分析
|深网络设计师|googlenet.
|挤压
|培训选项
|Trainnetwork.