火车残余网络图像分类
这个例子展示了如何创建一个与残余深度学习神经网络对CIFAR-10数据连接和训练它。剩余连接卷积神经网络架构的流行元素。通过网络使用剩余连接提高梯度流,使深层网络的训练。
对于许多应用程序,使用一个网络,由一个简单的序列层就足够了。然而,一些应用程序需要更复杂的图结构的网络层可以从多个输入层和输出到多个层。这些类型的网络通常被称为有向无环图(DAG)网络。剩余网络(ResNet)是一种DAG网络剩余(或快捷方式)连接,绕过主网络层。剩余连接启用参数梯度更容易传播的早些时候从输出层到层网络,这使得它可以更深层次的网络训练。这增加了网络深度会导致更高的精度更困难的任务。
ResNet架构由初始层,紧随其后栈包含剩余块,然后最后一层。有三种类型的残块:
初始残余块——这个块出现在第一个堆栈的开始。这个示例使用瓶颈组件;因此,此块包含相同的层将采样块,只有一大步
[1]
在第一个卷积层。有关更多信息,请参见resnetLayers
。标准残差块——这个块出现在每个堆栈,第一次将采样后残块。多次出现的这一块在每个堆栈和保存激活大小。
Downsampling残块——这个块出现在每个堆栈的开始(第一除外)和每个堆栈中只出现一次。第一个回旋的单位将采样块downsamples空间维度的两倍。
每个堆栈的深度不同,这个例子火车3个栈的残余网络减少深度。第一个堆栈深度四个,第二个堆栈深度三个,最后一个堆栈深度两个。
每个残块包含深度学习层。在每一块层的更多信息,看一下resnetLayers
。
创建和火车残余网络适合图像分类,遵循这些步骤:
创建一个残余网络使用
resnetLayers
函数。列车网络使用
trainNetwork
函数。是一个经过训练的网络DAGNetwork
对象。使用新数据进行分类和预测
分类
和预测
功能。
你也可以加载pretrained残余网络图像分类。有关更多信息,请参见Pretrained深层神经网络。
准备数据
下载CIFAR-10数据集[1]。数据集包含60000张图片。32-by-32每个图像像素大小和有三个颜色通道(RGB)。数据集的大小是175 MB。根据您的网络连接,下载过程可能需要时间。
datadir = tempdir;downloadCIFARData (datadir);
加载CIFAR-10训练和测试图像4 - d数组。训练集包含50000张图片和测试集包含10000张图片。使用CIFAR-10测试图像网络验证。
[XTrain, TTrain XValidation TValidation] = loadCIFARData (datadir);
你可以显示一个随机样本的训练图像使用以下代码。
图;idx = randperm(大小(XTrain, 4), 20);我= imtile (XTrain (:,:,:, idx) ThumbnailSize = (96、96));imshow (im)
创建一个augmentedImageDatastore
对象用于网络培训。在培训过程中,数据存储随机翻转训练图像沿垂直轴和随机翻译四个像素水平和垂直。数据增加有助于防止网络过度拟合和记忆的训练图像的细节。
图象尺寸= [32 32 3];pixelRange = 4 [4];imageAugmenter = imageDataAugmenter (…RandXReflection = true,…RandXTranslation = pixelRange,…RandYTranslation = pixelRange);augimdsTrain = augmentedImageDatastore(图象尺寸、XTrain TTrain,…DataAugmentation = imageAugmenter,…OutputSizeMode =“randcrop”);
定义网络体系结构
使用resnetLayers
函数创建一个残余网络适合这个数据集。
32-by-32 CIFAR-10图像像素,因此,使用一个小初始滤波器3和1的初始步幅的大小。设置的初始过滤到16。
第一个网络中的堆栈始于最初的残块。每个后续的堆栈始于downsampling残块。第一个回旋的单位将采样块downsample空间维度的两倍。保持所需的计算在每一个卷积层大致相同的整个网络,增加过滤器两倍的数量每次执行空间将采样。设置堆栈深度
(4 3 2)
和过滤器的数量(16 32 64)
。
initialFilterSize = 3;numInitialFilters = 16;initialStride = 1;numFilters =[16个32 64];stackDepth = [4 3 2];lgraph = resnetLayers(图象尺寸10…InitialFilterSize = InitialFilterSize,…InitialNumFilters = numInitialFilters,…InitialStride = InitialStride,…InitialPoolingLayer =“没有”,…StackDepth = [4 3 2],…NumFilters = [16 32 64]);
可视化网络。
情节(lgraph);
培训方案
指定培训选项。火车80年的网络时代。选择一个学习速率正比于mini-batch大小和学习速率降低10倍后60时代。验证每个时代网络一次使用验证数据。
miniBatchSize = 128;learnRate = 0.1 * miniBatchSize / 128;valFrequency =地板(大小(XTrain 4) / miniBatchSize);选择= trainingOptions (“个”,…InitialLearnRate = learnRate,…MaxEpochs = 80,…MiniBatchSize = MiniBatchSize,…VerboseFrequency = valFrequency,…洗牌=“every-epoch”,…情节=“训练进步”,…Verbose = false,…ValidationData = {XValidation, TValidation},…ValidationFrequency = valFrequency,…LearnRateSchedule =“分段”,…LearnRateDropFactor = 0.1,…LearnRateDropPeriod = 60);
列车网络的
培训网络使用trainNetwork
,设置doTraining
旗帜真正的
。否则,加载一个pretrained网络。培训网络良好的GPU接管两个小时。如果你没有一个GPU,然后培训需要更长的时间。
doTraining = false;如果doTraining净= trainNetwork (augimdsTrain、lgraph选项);其他的负载(“trainedResidualNetwork.mat”,“净”);结束
评估培训网络
计算的最终精度网络训练集(没有数据增大)和验证集。
(YValPred,聚合氯化铝)=(网络,XValidation)进行分类;validationError =意味着(YValPred ~ = TValidation);YTrainPred =分类(净,XTrain);trainError =意味着(YTrainPred ~ = TTrain);disp (“训练误差:+ trainError * 100 +“%”)
训练误差:3.462%
disp ("验证错误:"+ validationError * 100 +“%”)
验证错误:9.27%
情节混乱矩阵。显示每个类的精度和召回通过使用列和行摘要。网络最常把猫和狗。
图(单位=“归一化”位置= (0.2 - 0.2 0.4 - 0.4));厘米= confusionchart (TValidation YValPred);厘米。Title =“验证数据的混淆矩阵”;厘米。ColumnSummary =“column-normalized”;厘米。RowSummary =“row-normalized”;
你可以显示一个随机样本的九个测试图片连同他们的预测类和类的概率使用以下代码。
图idx = randperm(大小(XValidation, 4), 9);为i = 1:元素个数(idx)次要情节(3 3 i) imshow (XValidation (:,:,:, idx(我)));概率= num2str (100 * max(聚合氯化铝(idx(我),:)),3);predClass = char (YValPred (idx (i)));标题([predClass +”、“+问题+“%”])结束
引用
[1]Krizhevsky,亚历克斯。“学习的多层功能从微小的图像。”(2009). https://www.cs.toronto.edu/~kriz/learning-features-2009-TR.pdf
[2]他开明、象屿张任Shaoqing,剑太阳。“深层残留图像识别的学习。”In《IEEE计算机视觉与模式识别会议,770 - 778页。2016年。
另请参阅
resnetLayers
|resnet3dLayers
|trainNetwork
|trainingOptions
|layerGraph
|analyzeNetwork