学习使用Pretrained网络传输
这个例子显示了如何调整pretrained GoogLeNet卷积神经网络进行分类的新图片的集合。
GoogLeNet已经在超过一百万个图像和训练可以分类图像到1000年对象类别(如键盘、咖啡杯、铅笔,和许多动物)。网络已经学会丰富广泛的图像特征表示。网络需要一个图像作为输入和输出图像中对象的标签一起为每个对象的类别的概率。
在深度学习应用程序转移学习是常用的。pretrained网络,可以使用它作为一个起点,学习一个新任务。微调网络转移学习通常比训练一个网络快得多,也更容易与随机初始化权重从零开始。您可以快速学习功能转移到一个新的任务使用较少的训练图像。
加载数据
解压缩和加载新的图像作为图像数据存储。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次要情节(4 4 i) i = readimage (imdsTrain idx (i));imshow(我)结束
负载Pretrained网络
加载pretrained GoogLeNet神经网络。如果深入学习工具箱™模型GoogLeNet网络没有安装,那么软件提供一个下载链接。
网= googlenet;
使用deepNetworkDesigner
显示一个交互式可视化的网络体系结构和网络层的详细信息。
deepNetworkDesigner(净)
第一层,即图像输入层,需要输入的图像大小224 - 224 - 3,3是颜色通道的数量。
.InputSize inputSize = net.Layers (1)
inputSize =1×3224 224 3
取代最后一层
完全连接层和分类层pretrained网络净
配置为1000类。这两个层,loss3-classifier
和输出
GoogLeNet,包含的信息如何结合网络特性,提取类概率,损失价值,预测标签。再培训pretrained网络分类的新图像,用新的替换这两个层层适应新的数据集。
从训练网络提取层图。
lgraph = layerGraph(净);
用一个新的替换完全连接层完全连接层的输出等于类的数量。更快地使学习在新的层比传输层,增加WeightLearnRateFactor
和BiasLearnRateFactor
完全连接层的值。
numClasses =元素个数(类别(imdsTrain.Labels))
numClasses = 5
newLearnableLayer = fullyConnectedLayer (numClasses,…“名字”,“new_fc”,…“WeightLearnRateFactor”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 = augmentedImageDatastore (inputSize (1:2), imdsTrain,…“DataAugmentation”,imageAugmenter);
自动调整验证图像不执行进一步的数据,使用一个增强的图像数据存储不指定任何额外的预处理操作。
augimdsValidation = augmentedImageDatastore (inputSize (1:2), imdsValidation);
指定培训选项。转移学习,防止功能的早期层pretrained网络(传输层的重量)。放慢学习的传输层,设置初始学习速率小值。在前面的步骤中,您增加了学习速率因子完全连接层加快学习在新的最后一层。这种组合的学习速率设置导致快速学习只有在新的层和慢学习其他层。当执行转移学习,你不需要训练尽可能多的时代。一个时代是一个完整的培训周期在整个训练数据集。指定mini-batch大小和验证数据。软件验证网络的每一个ValidationFrequency
迭代在训练。
选择= trainingOptions (“个”,…“MiniBatchSize”10…“MaxEpochs”6…“InitialLearnRate”1的军医,…“洗牌”,“every-epoch”,…“ValidationData”augimdsValidation,…“ValidationFrequency”3,…“详细”假的,…“阴谋”,“训练进步”);
列车网络组成的转移和新层。默认情况下,trainNetwork
使用GPU如果一个是可用的。这需要并行计算工具箱™和支持GPU设备。万博1manbetx支持设备的信息,请参阅万博1manbetxGPU计算的需求(并行计算工具箱)。否则,它使用一个CPU。您还可以指定使用的执行环境“ExecutionEnvironment”
名称-值对的观点trainingOptions
。
netTransfer = trainNetwork (augimdsTrain、lgraph选项);
验证图像进行分类
使用调整网络验证图像进行分类。
[YPred,分数]= (netTransfer augimdsValidation)进行分类;
显示四个样本验证图像预测标签。
idx = randperm(元素个数(imdsValidation.Files), 4);图为i = 1:4次要情节(2,2,我)我= readimage (imdsValidation idx (i));imshow(我)标签= YPred (idx (I));标题(字符串(标签));结束
计算上的分类精度验证集。精度是标签的一部分网络预测正确。
YValidation = imdsValidation.Labels;精度=意味着(YPred = = YValidation)
精度= 1
在提高分类精度的建议,见深度学习技巧和窍门。
引用
[1]Krizhevsky,亚历克斯,Ilya Sutskever和杰弗里·e·辛顿。“ImageNet与深卷积神经网络分类。”先进的神经信息处理系统25 (2012)。
[2]Szegedy,基督徒,魏Liu Yangqing贾,皮埃尔•Sermanet斯科特•里德Dragomir Anguelov, Dumitru Erhan,文森特Vanhoucke和安德鲁·拉比诺维奇。“更深的曲线玲珑。”《IEEE计算机视觉与模式识别会议(2015):1 - 9。
[3]“BVLC GoogLeNet模式。”https://github.com/BVLC/caffe/tree/master/models/bvlc_googlenet。
另请参阅
trainNetwork
|trainingOptions
|squeezenet
|googlenet
|analyzeNetwork
|深层网络设计师