文档

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

这个例子展示了如何为深度学习分类创建和训练一个简单的卷积神经网络。卷积神经网络是深度学习的重要工具,尤其适用于图像识别。学习如何设置网络层、图像数据和训练选项、训练网络和测试分类准确性。

加载和浏览图像数据

加载数字样例数据作为ImageDatastore对象。

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

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

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

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

检查每个类别中的图像数量。

CountLabel = digitData.countEachLabel;

CountLabel是一个表,其中包含标签和每个标签中的图像数量。它显示数据存储为0-9的每个数字包含1000个图像,总共10000个。因此,有10个类。您可以将网络的最后一个完全连接层中的类数量指定为OutputSize参数。这些图像是通过对使用不同字体创建的数字图像应用随机转换而生成的。

您必须在网络的输入层中指定图像的大小。检查第一张图片的大小digitData

img = readimage(digitData,1);大小(img)
Ans = 28 28

每个数字图像是28 × 28 × 1像素。

指定训练和测试集

将数据分为训练集和测试集,使训练集中的每个类别有750张图像,测试集中有每个标签的剩余图像。

trainingNumFiles = 750;rng (1)%为了重现性[trainDigitData,testDigitData] = splitEachLabel(digitData,trainingNumFiles,“随机”);

splitEachLabel分割图像文件digitData到两个新的数据存储中,trainDigitDatatestDigitData

定义网络层

定义卷积神经网络架构。

layers = [imageInputLayer([28 28 1]) convolution2dLayer(5,20) reluLayer maxPooling2dLayer(2,“步”,2) fulllyconnectedlayer (10) softmaxLayer classificationLayer()];

图像输入层一个imageInputLayer是指定图像大小的地方,在本例中是28 × 28 × 1。这些数字对应于高度、宽度和通道大小。数字数据由灰度图像组成,因此通道大小(彩色通道)为1。对于彩色图像,通道大小为3,对应于RGB值。您还可以在此层指定任何数据转换,例如数据规范化或数据增强(随机翻转或裁剪数据)。这些通常用来避免过拟合。您不需要将数据洗牌为trainNetwork在训练开始时自动完成。

卷积的层在卷积层,第一个参数是filterSize,这是训练函数在沿着图像扫描时使用的过滤器的高度和宽度。在本例中,数字5表示过滤器大小为[5,5]。您还可以为过滤器的高度和宽度指定不同的大小。第二个参数是过滤器的数量,即连接到输出的同一区域的神经元的数量。该参数决定了特征映射的数量。也可以定义或者这一层的学习率convolution2dLayer

ReLU层卷积层之后是一个非线性激活函数。MATLAB采用整流线性单位函数,由reluLayer

Max-Pooling层卷积层(带有激活函数)之后通常会进行下采样操作,以减少参数的数量,并作为避免过拟合的另一种方法。下采样的一种方法是最大池化,它由maxPooling2dLayer函数。这一层返回输入矩形区域的最大值,由第一个参数指定,poolSize.在本例中,矩形区域的大小为[2,2]。可选参数确定训练函数沿图像扫描时的步长。当网络中有多个卷积层时,这个最大池化层发生在卷积层之间。

全连接层卷积(和下采样)层之后是一个或多个完全连接的层。顾名思义,全连接层中的所有神经元都与前一层的神经元相连。这一层结合了图像上前一层学习到的所有特征(局部信息),以识别更大的模式。最后一个完全连接层将它们组合起来对图像进行分类。这就是为什么最后一个完全连接层中的OutputSize参数等于目标数据中的类的数量。在本例中,输出大小为10,对应于10位数字。

Softmax层全连接层通常使用softmax激活函数进行分类。添加softmax图层可以使用softmaxLayer最后一个完全连接层之后的功能。

分类层最后一层是分类层,通过使用classificationLayer函数。这一层使用softmax激活函数为每个输入返回的概率将其分配给一个互斥类。

指定培训选项

在定义层(网络结构)之后,指定训练选项。将带有动量的随机梯度下降的选项设置为默认设置。设置最大epoch数为15(一个epoch是整个训练数据上的一个完整训练周期),并以0.0001的初始学习率开始训练。

options = trainingOptions(“个”“MaxEpochs”15岁的“InitialLearnRate”, 0.0001);

使用训练数据训练网络

使用在前面步骤中定义的训练数据和训练选项,训练在层中定义的网络。

convnet = trainNetwork(trainDigitData,layers,options);
在单个GPU上进行训练。初始化图像规范化。|=========================================================================================| | 时代| |迭代时间| Mini-batch | Mini-batch |基地学习| | | | | | |精度损失速率(秒)  | |=========================================================================================| | 1 | 1 | 4.38 | 3.0845 | 13.28% | 0.0001 | | 1 | 50 | 5.44 | 1.0945 | 65.63% | 0.0001 | | 2 | 100 | 6.17 | 0.7276 | 74.22% | 0.0001 | | 3 | 150 | 6.92 | 0.4741 | 83.59% | 0.0001 | | 4 | 200 |7.66 | 0.3085 | 92.19% | 0.0001 | | 250 | | 8.41 | 0.2323 | 92.97% | 0.0001 | | 6 | 300 | 9.16 | 0.1542 | 97.66% | 0.0001 | | 350 | | 9.90 | 0.1313 | 97.66% | 0.0001 | | 400 | | 10.64 | 0.0944 | 96.09% | 0.0001 | | 450 | | 11.40 | 0.0667 | 99.22% | 0.0001 | | 500 | | 12.16 | 0.0459 | 99.22% | 0.0001 | | 550 | | 12.93 | 0.0544 | 100.00% | 0.0001 | | 600 | | 13.68 | 0.0660 | 99.22% | 0.0001 | | 650 | | 14.43 | 0.0339 | 100.00% | 0.0001 | | | 700 | | 15.17 | 0.0341 | 100.00%0.0001 | | 750 | | 15.89 | 0.0369 | 100.00% | 0.0001 | | 800 | | 16.62 | 0.0263 | 100.00% | 0.0001 | | 850 | | 17.37 | 0.0181 | 100.00% | 0.0001 | | | 870 | | 0.0001 | 17.66 | 0.0234 100.00%  | |=========================================================================================|

trainNetwork在显示窗口中显示用于训练的硬件。如果有可用的GPU,它默认使用GPU(需要Parallel Computing Toolbox (TM)和支持cuda的GPU,计算能力为3.0或更高)。如果没有可用的GPU,则使用CPU。方法指定执行环境“ExecutionEnvironment”的调用中的名称-值对参数trainingOptions

进度窗口显示了第一次迭代、最后一次迭代以及中间每50次迭代的小批损失和小批精度。小批量损失是k个互斥类的交叉熵函数而小批准确率是当前小批中被训练的网络正确分类的图像的百分比。

它还显示了训练所需的累积时间和迭代中的学习率。在这个例子中,在整个训练过程中,基本学习率固定为0.0001。你也可以调整这一点,并在一定数量的epoch时降低学习率。有关详细信息,请参见trainingOptions功能参考页面。

对测试数据中的图像进行分类并计算精度

在未用于训练网络的测试集上运行训练后的网络,并预测图像标签(数字)。

YTest =分类(convnet,testDigitData);TTest = testDigitData.Labels;

计算精度。

准确性= sum(YTest == TTest)/numel(TTest)
精度= 0.9812

准确率是测试数据中与分类相匹配的真实标签的数量与测试数据中图像的数量之比。在这种情况下,大约98%的数字估计与测试集中的真实数字值相匹配。

另请参阅

|

相关的话题

这个话题有帮助吗?