ディ,プラ,ニング

从头开始训练一个模型

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

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

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

对于这个简单的数据集,有了正确的深度学习模型和训练选项,就有可能达到几乎100%的准确率。那么我们如何创建一个模型来达到这一点呢?

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

1.访问数据

我们首先将数字图像加载到MATLAB中。数据集存储在许多不同的文件类型中。该数据存储为图像文件的集合。这几行代码将为图像数据创建一个数据存储,这将帮助您管理图像文件。

digitDatasetPath = fullfile(matlabroot,“工具箱”“nnet”“nndemos”,……“nndatasets”“DigitDataset”);imds = imageDatastore(digitDatasetPath,…IncludeSubfolders = true, LabelSource =“foldernames”);

检查第一张图片的大小。这些图像非常小——只有28 x 28像素。

Img = readimage(imds,1);Size (img) ans = 28

将数据划分为训练数据集和验证数据集,使训练集包含750张图像,验证集包含其余图像。

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

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

2.创建并配置网络层

我们将从构建CNN开始,CNN是一种常见的用于分类图像的深度学习网络。

对美国有线电视新闻网

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

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

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

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

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

3.培训网络

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

常用培训方案

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

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

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

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

(MaxEpoch = 20)

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

Mini-batch大小

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

(MiniBatchSize = 64)

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

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

我们从指定培训选项开始。然后,我们训练网络并监控训练进度。

options = trainingOptions(“个”,……InitialLearnRate = 0.1,……MaxEpochs = 2,…情节=“训练进步”);net = trainNetwork(imdsTrain,layers,options);

4.检查网络准确性

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

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

改变培训选择

我们降低了初始学习率,增加了epoch的数量。

InitialLearnRate = 0.01 MaxEpocs = 4

通过改变这些参数,我们得到了更好的结果——几乎100%!

验证准确性

在网络训练完成后,我们在验证集的图像上测试它。

YPred =分类(net,imdsValidation);YValidation = imdsValidation.Labels;precision = sum(YPred == YValidation)/ nummel (YValidation) accuracy = 0.9968

现在我们知道了训练过的网络有多准确,我们现在可以用它来识别在线图像中的手写字母,甚至是实时视频流中的手写字母。

修改网络配置

有时,提高准确性需要更深层次的网络和多轮试错。我们可以添加更多的层,包括批处理归一化层,这将有助于加快网络收敛(它对新输入做出正确响应的点)。这就创造了一个“更深”的网络。

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


了解更多

跟着一个例子

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