深度学习的例子

探索深度学习示例,并学习如何在MATLAB中开始学习。

从头开始训练一个模型

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

手写的数字

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

如果你刚刚开始应用深度学习,使用这个数据集的另一个优势是你可以在不投资昂贵的GPU的情况下训练它。

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

这将是一个迭代的过程,我们将在之前的训练结果的基础上,找出如何解决训练问题。具体步骤如下:

培训步骤

1.访问数据

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

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

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

> >谁imgDataTrain名称大小字节类imgDataTrain 28x28x1x60000 47040000 uint8

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

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

2.创建并配置网络层

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

对美国有线电视新闻网

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

要了解更多CNN的结构,请观看:

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

图层= [imageInputLayer([28 28 1])卷积2dlayer (3,16,“填充”,1) maxPooling2dLayer(2,“步”32岁的,2)convolution2dLayer (3“填充”,1) maxPooling2dLayer(2,“步”, 2) convolution2dLayer (64,“填充”,1) batchNormalizationLayer reluLayer fullyConnectedLayer(10) softmaxLayer classificationLayer];

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

3.培训网络

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

常用培训方案

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

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

使用(“情节”、“训练进步”)在训练过程中绘制网络的进度图。
马克思时代

epoch是训练算法在整个训练集上的完整传递。

(' MaxEpoch ', 20)

指定的epoch越多,网络训练的时间就越长,但准确性可能会随着每个epoch而提高。

Mini-batch大小

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

(' MiniBatchSize ', 64)

迷你批处理越大,训练速度越快,但最大大小将由GPU内存决定。如果你在训练时得到一个记忆错误,减少迷你批大小。

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

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

miniBatchSize = 8192;选项= trainingOptions(“个”,……“MiniBatchSize”, miniBatchSize,…“阴谋”“训练进步”);net = trainNetwork(imgDataTrain, labelsTrain, layers, options);

然后我们运行网络并监控其进展。

4.检查网络准确性

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

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

改变培训选择

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

“InitialLearnRate”,0.0001

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

培训进展

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

修改网络配置

从90%提高到99%需要更深入的网络和多轮试错。我们添加了更多的层,包括批处理规范化层,这将有助于加快网络收敛(它对新输入做出正确响应的点)。

这个网络现在“更深了”。这一次,我们将改变网络,但保持训练选项与之前相同。

在网络训练完成后,我们在10,000张图像上测试它。

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

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

在从头开始创建网络时,您将负责确定网络配置。这种方法为你提供了对网络的最大控制,并且可以产生令人印象深刻的结果,但它需要理解神经网络的结构以及层类型和配置的许多选项。


了解更多

跟着一个例子

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