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

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

这个例子演示了如何:

  • 加载和探索图像数据。

  • 定义网络架构。

  • 指定培训选项。

  • 培训网络。

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

加载和探索图像数据

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

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

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

数字;烫发= randperm(10000,20);i = 1:20 (4,5,i);imshow (imds.Files{烫发(i)});结束

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

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

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

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

指定训练和验证集

将数据划分为训练数据集和验证数据集,使训练集中的每个类别都包含750张图像,验证集中包含来自每个标签的剩余图像。splitEachLabel将数据存储digitData进入两个新的数据存储,trainDigitDatavalDigitData

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

定义网络体系结构

定义卷积神经网络结构。

layer = [imageInputLayer([28 28 1])] convolution2dLayer(3,8,“填充”,'相同') batchNormalizationLayer reluLayer“步”,2)convolution2dLayer(3,16,“填充”,'相同') batchNormalizationLayer reluLayer“步”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层。

马克斯池层卷积层(带有激活函数)之后,有时会执行向下采样操作,以缩小feature map的空间大小并删除冗余的空间信息。下采样使得在不增加每层所需的计算量的情况下增加较深卷积层中的过滤器数量成为可能。向下采样的一种方法是使用最大池,您可以使用它创建maxPooling2dLayer。最大池化层返回输入矩形区域的最大值,由第一个参数指定,poolSize。在本例中,矩形区域的大小为[2,2]。的“步”名称-值对参数指定训练函数在扫描输入时所接受的步长。

完全连接层卷积和下采样层,接着通过一个或多个完全连接层。正如其名称所暗示的,一个完全连接层是其中神经元连接到所有神经元前述层中的层。该层结合了所有的功能通过在图像的前面的层学会了识别较大的图案。最后完全连接层结合的特征对图像进行分类。因此,OutputSize最后一个完全连接层中的参数等于目标数据中类的数量。在本例中,输出大小为10,对应于10个类。使用fullyConnectedLayer创建完全连接层。

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

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

指定培训选项

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

选择= trainingOptions (“个”,“InitialLearnRate”, 0.01,“MaxEpochs”4“洗牌”,“每个历元”,“ValidationData”imdsValidation,'ValidationFrequency'30,“详细”,假,“阴谋”,“训练进步”);

训练网络使用训练数据

培养使用由限定的体系结构的网络、训练数据和训练选项。默认情况下,trainNetwork使用GPU(如果可用)(需要并行计算工具箱™和启用CUDA®GPU计算能力3.0或更高版本)。否则,它使用一个CPU。您也可以通过指定执行环境“ExecutionEnvironment”的名称-值对参数trainingOptions

训练进度图显示了小批量的损失和准确性,确认损失和准确性。有关训练进度情节的详细信息,请参阅监控深度学习训练的进展。损失是交叉熵损失。准确率是指网络正确分类的图像的百分比。

净= trainNetwork(imdsTrain,层,选项);

分类验证图像和计算精度

预测用训练网络验证数据的标签,并计算出最终验证准确性。准确性是标签,网络正确地预测分数。在这种情况下,预测标签的99%以上匹配验证集的真实标签。

YPred =分类(净,imdsValidation);YValidation = imdsValidation.Labels;准确性= sum(YPred == YValidation)/numel(YValidation)
精度= 0.9988

另请参阅

|||

相关话题