深度学习的例子

探索深度学习的例子,并了解如何在Matlab中开始。

从头开始训练一个模型

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

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

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

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

这将是一个迭代过程,我们建立了以前的培训结果,以弄清楚如何接近培训问题。步骤如下:

1.访问数据

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

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

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

> >谁ImgDataTrain.名称大小字节类imgdataTrain 28x28x1x60000 47040000 uint8

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

下一个任务将是图像标签,但由于MNIST图像带有标签,我们可以跳过繁琐的步骤并迅速继续前进到建立我们的神经网络。

2.创建和配置网络层

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

关于CNNS.

CNN获取一幅图像,将其通过网络层,然后输出最后一个类。该网络可以有数十或数百层,每一层都可以学习检测图像的不同特征。滤波器应用于每幅不同分辨率的训练图像,每幅卷积图像的输出被用作下一层的输入。金宝搏官方网站滤镜可以从非常简单的特征开始,比如亮度和边缘,然后随着图层的发展,增加特征的复杂性,以唯一地定义对象。

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

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

layers = [imageInputLayer([28 28 1])卷积2dlayer (3,16,“填充”1)BatchnormalizationLayer Ruilulayer MaxPooling2dlayer(2,'走吧',2)卷积2dlayer(3,32,“填充”1)BatchnormalizationLayer Ruilulayer MaxPooling2dlayer(2,'走吧',2)卷积2dlayer(3,64,“填充”,1) batchNormalizationLayer reluLayer fulllyconnectedlayer (10) softmaxLayer classiationlayer];

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

3.培训网络

首先,我们选择培训选项。有许多可供选择的方法。表格显示了最常用的选项。

常用的培训选择

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

该图显示了迷你批量损失和准确性。它包括一个停止按钮,可让您在任何时候都停止网络培训。

使用(“情节”、“训练进步”)绘制网络在训练时的进展。
最大时期

纪元是培训算法在整个训练集中的完整通行证。

('maxepoch',20)

指定的epoch越多,网络训练的时间就越长,但精度可能会随着epoch的增加而提高。

Mini-batch大小

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

('小匹匹匹匹兹',64)

较小的批次,培训越快,但最大尺寸将由GPU存储器确定。如果在培训时收到内存错误,请减少迷你批量大小。

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

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

minibatchsize = 8192;选项=培训选项(“个”,......'minibatchsize',小靶,......'plots''培训 - 进步');net = trainnetwork(imgdataTrain,labelstrain,图层,选项);

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

4.检查网络准确性

我们的目标是提高模型的准确性随着时间的推移而增加。作为网络列车,出现进度图。

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

改变培训选择

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

'InitialLearnrate',0.0001

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

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

更改网络配置

从90%获得99%需要更深的网络和许多回复和错误。我们添加更多层数,包括批量标准化图层,它将有助于加快网络收敛(它正确响应新输入的点)。

网络现在“更深”。这次,我们将改变网络,但将培训选项留出与之前的培训选项。

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

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

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

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


学到更多

跟随一个例子

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