深度学习的例子

探索深入学习的示例,并学习如何开始使用MATLAB。

从头开始训练模型

在这个例子中,我们想训练一个卷积神经网络(CNN)来识别手写数字。我们将使用来自MNIST数据集,其中包含60000张手写数字0-9的图像。以下是MNIST数据集中25个手写数字的随机样本:

通过使用一个简单的数据集,我们将能够涵盖深度学习工作流中的所有关键步骤,而无需处理诸如处理能力或太大而无法放入内存的数据集等挑战。您可以将此处描述的工作流应用于更复杂的深度学习问题和更大的数据集。

如果您刚刚开始应用深度学习,那么使用此数据集的另一个优势是您可以在不投资昂贵的GPU的情况下对其进行培训。

即使数据集很简单,只要有正确的深度学习模型和训练选项,也有可能达到99%以上的准确率。那么,我们如何创建一个模型来实现这一点呢?

这将是一个迭代过程,在此过程中,我们将根据以前的培训结果来确定如何解决培训问题。步骤如下:

1.访问数据

我们首先下载MNIST图像输入MATLAB。数据集存储在许多不同的文件类型中。这些数据存储为二进制文件,MATLAB可以快速使用这些文件并将其重塑为图像。
这些代码行将读取一个原始二进制文件,并创建所有训练图像的数组。

uint8 (fread(fid), numImg * numRows * numCols,‘uint8’));%将数据部分重塑为4D数组rawImgDataTrain =重塑(rawImgDataTrain, [numRows, numCols, numImgs]);imgDataTrain (:,:, 1, 2) = uint8 (rawImgDataTrain(:,:,(二));

我们可以通过在命令窗口中输入whoos来检查数据的大小和类别。

> >谁伊姆格达塔特兰名称大小字节类imgDataTrain 28x28x1x60000 47040000 uint8

这些图像非常小——只有28 x 28像素——总共有60000张训练图像。

下一个任务将是图像标记,但由于MNIST图像带有标签,我们可以跳过这一繁琐的步骤,快速构建我们的神经网络。

2.创建和配置网络层

我们将从构建CNN开始,这是最常见的一种深度学习网络。

关于CNN

CNN获取图像,将其通过网络层,并输出最终类。该网络可以有数十层或数百层,每一层都学习检测图像的不同特征。对每一幅不同分辨率的训练图像进行滤波,每一幅卷积图像的输出作为下一层的输入。万博 尤文图斯过滤器可以从非常简单的特征开始,如亮度和边缘,并增加复杂性的特征,唯一定义的对象随着层的进展。

要了解有关CNN结构的更多信息,请观看:

由于我们从头开始训练CNN,我们必须首先指定它将包含哪些层以及以什么顺序。

layers = [imageInputLayer([28 28 1])]“填充”,1)batchNormalizationLayer reluLayer MaxPoolig2Dlayer(2,“大步走”,2)卷积2层(3,32,“填充”,1)batchNormalizationLayer reluLayer MaxPoolig2Dlayer(2,“大步走”,2)卷积2层(3,64,“填充”,1) batchNormalizationLayer reluLayer fulllyconnectedlayer (10) softmaxLayer classificationLayer];

您可以在文档中了解所有这些层的更多信息。

3.培训网络

首先,我们选择培训方案。有很多选择。表格显示了最常用的选项。

常用的培训方案

培训选项 定义 暗示
训练进度图

该图显示了小批量损失和精度。它包括一个停止按钮,可以让您在任何时候停止网络培训。

使用(“情节”、“训练进步”)来绘制网络训练的进度。
最大时代

历元是训练算法在整个训练集上的完整过程。

('MaxEpoch',20)

指定的纪元越多,网络训练的时间就越长,但精确度可能会随着每个纪元而提高。

Mini-batch大小

小批处理是同时处理的训练数据集的子集。

('MiniBatchSize',64)

小批量越大,训练速度越快,但最大大小将由GPU内存决定。如果训练时出现内存错误,请减小小批量大小。

学习率 这是控制训练速度的主要参数。 较低的学习率可以给出更准确的结果,但网络可能需要更长的时间来训练。

我们首先指定两个选项:绘图进度和迷你批大小。

miniBatchSize=8192;选项=培训选项(“个”,...“MiniBatchSize”,miniBatchSize,。。。“情节”,“培训进度”); net=列车网络(imgDataTrain、标签列车、图层、选项);

然后我们运行网络并监控它的进度。

4.检查网络准确性

我们的目标是使模型的准确性随着时间的推移而提高。随着网络的训练,将出现进度图。

我们将尝试更改培训选项和网络配置。

改变培训方案

首先,我们将调整学习速率。我们将初始学习速率设置为远低于默认速率0.01。

“InitialLearnRate”,0.0001

由于改变了这一参数,我们得到了更好的结果,接近99%!

对于某些应用程序,这个结果是令人满意的,但您可能还记得,我们的目标是99%。

更改网络配置

从90%到99%需要更深入的网络和多轮的尝试和错误。我们添加了更多的层,包括批量标准化层,这将有助于加快网络速度收敛(对新输入做出正确响应的点)。

网络现在“更深”。这一次,我们将更改网络,但保留与以前相同的培训选项。

网络训练完成后,我们在10000张图像上进行测试。

predLabelsTest = net.classify (imgDataTest);= sum(predLabelsTest == labelsTest) / numel(labelsTest) testAccuracy = 0.9913

我们现在可以用它来识别在线图像中的手写字母,甚至是在线视频流中的手写字母。

当从头开始创建网络时,您负责确定网络配置。这种方法使您能够对网络进行最大程度的控制,并能产生令人印象深刻的结果,但它需要了解神经网络的结构以及层类型和配置的许多选项。


了解更多

跟随一个例子

学习如何训练卷积神经网络(CNN)来识别手写数字。