主要内容

创建简单的深度学习网络分类

这个例子展示了如何创建和训练一个简单的卷积神经网络进行深度学习分类。卷积神经网络是深度学习的基本工具,尤其适用于图像识别。

该示例演示了如何:

  • 加载和探索图像数据。

  • 定义网络架构。

  • 指定培训选项。

  • 训练网络。

  • 预测新数据的标签,计算分类精度。

有关演示如何以交互方式创建和训练简单图像分类网络的示例,请参见使用深度网络设计器创建简单的图像分类网络

加载和探索图像数据

将数字示例数据加载为图像数据存储。imageDatastore根据文件夹名称自动标记图像,并将数据存储为ImageDatastore对象。图像数据存储使您能够存储大型图像数据,包括不适合内存的数据,并在卷积神经网络训练期间有效地读取批量图像。

digitDatasetPath = fullfile(matlabroot,“工具箱”“nnet”“nndemos”...“nndatasets”“DigitDataset”);imds = imageDatastore(digitDatasetPath,...“IncludeSubfolders”,真的,“LabelSource”“foldernames”);

显示数据存储中的一些图像。

图;Perm = randperm(10000,20);I = 1:20 subplot(4,5, I);imshow (imds.Files{烫发(i)});结束

计算每个类别的图像数量。labelCount是一个表,其中包含标签和具有每个标签的图像的数量。该数据存储为0-9的每个数字包含1000个图像,总共包含10000个图像。您可以将网络的最后一个完全连接层中的类数量指定为OutputSize论点。

labelCount = countEachLabel(imds)
labelCount =10×2表标签数_____ _____ 0 1000 1 1000 2 1000 3 1000 4 1000 5 1000 6 1000 7 1000 8 1000 9 1000

您必须在网络的输入层中指定图像的大小。检查第一张图片的大小digitData.每张图片都是28 × 28 × 1像素。

Img = readimage(imds,1);大小(img)
ans =1×228日28日

指定训练集和验证集

将数据划分为训练数据集和验证数据集,使训练集中的每个类别包含750张图像,验证集包含每个标签中剩余的图像。splitEachLabel分割数据存储digitData到两个新的数据存储中,trainDigitData而且valDigitData

numTrainFiles = 750;[imdsTrain,imdsValidation] = splitEachLabel(imds,numTrainFiles,“随机”);

定义网络架构

定义卷积神经网络体系结构。

layers = [imageInputLayer([28 28 1]) convolution2dLayer(3,8,“填充”“相同”maxPooling2dLayer(2,“步”2) convolution2dLayer(16日“填充”“相同”maxPooling2dLayer(2,“步”32岁的,2)convolution2dLayer (3“填充”“相同”) batchNormalizationLayer reluLayer fullyConnectedLayer(10) softmaxLayer classificationLayer];

图像输入层一个imageInputLayer是指定图像大小的地方,在本例中,是28乘28乘1。这些数字对应于高度、宽度和通道大小。数字数据由灰度图像组成,因此通道大小(彩色通道)为1。对于彩色图像,通道大小为3,对应于RGB值。您不需要打乱数据,因为trainNetwork默认情况下,会在训练开始时打乱数据。trainNetwork还可以在训练期间的每个历元的开始自动洗牌数据。

卷积的层在卷积层中,第一个参数是filterSize,这是训练函数在扫描图像时使用的滤波器的高度和宽度。在本例中,数字3表示过滤器大小为3 × 3。您可以为过滤器的高度和宽度指定不同的大小。第二个参数是过滤器的数量,numFilters,这是连接到输入的同一区域的神经元的数量。该参数决定了特征映射的数量。使用“填充”名称-值对用于向输入特征映射添加填充。对于默认步幅为1的卷积层,“相同”填充确保空间输出大小与输入大小相同。您还可以使用的名称-值对参数为该层定义步幅和学习率convolution2dLayer

批处理归一化层批处理归一化层对通过网络传播的激活和梯度进行归一化,使网络训练成为一个更容易的优化问题。在卷积层和非线性层之间使用批处理归一化层,如ReLU层,可以加速网络训练,降低对网络初始化的敏感性。使用batchNormalizationLayer创建一个批处理规范化层。

ReLU层批处理归一化层后面跟着一个非线性激活函数。最常见的激活函数是整流线性单元(ReLU)。使用reluLayer创建一个ReLU层。

最大池化层卷积层(带有激活函数)之后有时会进行向下采样操作,以减少特征映射的空间大小并删除冗余的空间信息。下采样使得在更深的卷积层中增加滤波器的数量而不增加每层所需的计算量成为可能。下采样的一种方法是使用最大池,您可以使用maxPooling2dLayer.最大池化层返回输入矩形区域的最大值,由第一个参数指定,poolSize.在本例中,矩形区域的大小为[2,2]。的“步”名称-值对参数指定训练函数沿输入扫描时的步长。

全连通层卷积层和下采样层后面是一个或多个完全连接层。顾名思义,完全连通层是指神经元与前一层中的所有神经元相连的一层。这一层结合了图像中前一层学到的所有特征,以识别更大的模式。最后一层是完全连接层,将特征结合起来对图像进行分类。因此,OutputSize参数的值等于目标数据中的类数。在本例中,输出大小为10,对应于10个类。使用fullyConnectedLayer创建一个完全连接的层。

Softmax层softmax激活函数规范化全连接层的输出。softmax层的输出由和为1的正数组成,然后可以被分类层用作分类概率。创建一个softmax层使用softmaxLayer功能后的最后一个完全连接层。

分类层最后一层是分类层。这一层使用softmax激活函数为每个输入返回的概率,将输入分配给互斥类中的一个并计算损失。要创建一个分类层,使用classificationLayer

指定培训选项

在定义网络结构之后,指定培训选项。使用带有动量的随机梯度下降(SGDM)训练网络,初始学习率为0.01。设置最大代数为4。一个epoch是整个训练数据集上的一个完整的训练周期。通过指定验证数据和验证频率来监控训练过程中的网络准确性。每隔一个时代洗牌数据。该软件在训练数据上训练网络,并在训练期间定期计算验证数据的准确性。验证数据不用于更新网络权重。打开训练进度图,并关闭命令窗口输出。

options = trainingOptions(“个”...“InitialLearnRate”, 0.01,...“MaxEpochs”4...“洗牌”“every-epoch”...“ValidationData”imdsValidation,...“ValidationFrequency”30岁的...“详细”假的,...“阴谋”“训练进步”);

使用训练数据的训练网络

使用定义的体系结构来训练网络、训练数据和训练选项。默认情况下,trainNetwork如果有GPU就使用GPU,否则就使用CPU。GPU培训需要并行计算工具箱™和支持的GPU设备。有关支持的设备的信息,请参见GPU计算要求(并行计算工具箱).方法还可以指定执行环境“ExecutionEnvironment”的名值对参数trainingOptions

训练进度图显示了小批量损失和准确性以及验证损失和准确性。有关训练进度图的更多信息,请参见监控深度学习培训进度.损失是交叉熵损失。精确度是指网络正确分类的图像的百分比。

net = trainNetwork(imdsTrain,layers,options);

对验证图像进行分类并计算精度

利用训练过的网络对验证数据进行标签预测,并计算最终的验证精度。准确性是网络正确预测的标签的比例。在这种情况下,超过99%的预测标签与验证集的真实标签匹配。

YPred = category (net,imdsValidation);YValidation = imdsValidation.Labels;accuracy = sum(YPred == YValidation)/numel(YValidation)
精度= 0.9988

另请参阅

|||

相关的话题

Baidu
map