深度学习

理解和使用深度学习网络

高级深度学习:第1部分

建立任何一个深度学习网络
对于接下来的几个帖子,我希望我们全部走出我们的舒适区。我将探索和特色更先进的深度学习主题。19B发行版引入了许多新的和令人兴奋的功能,我已经犹豫了尝试,因为人们开始播放,如术语,自定义训练循环,自动分化(甚至是“autodiff”如果您真的知道)。但我认为现在是时候潜入并探索新的概念,而不仅仅是为了理解它们,而且了解在哪里以及为什么要使用它们。
除了深度学习的基础知识,还有很多东西需要消化,所以我决定创建一系列的帖子。你现在正在阅读的这篇文章将作为一个基础和关键术语的温和介绍,然后是一系列关于各个网络类型(自动编码器、暹罗网络、gan和注意力机制)的文章。
高级深度学习基础
首先,让我们从为什么为什么我要使用扩展深度学习框架?到现在为止,我过得还不错。”首先,你得到一个灵活的训练结构,它允许你在MATLAB中创建任何网络。在下一篇文章中介绍的更复杂的结构需要扩展框架来解决如下特性:
  • 多输入多输出
  • 自定义丢失功能
  • 重量分享
  • 自动分化
  • 培训期间的特殊可视化
我将展示一个简单的深度学习示例,然后重写它以使用扩展框架,尽管它并不需要它。为什么?因为当更复杂的例子出现时,我们已经知道结构和要做什么了。
让我们从一个简单的例子开始,我们都知道和爱:mnist。这个简单的手写示例有各种各样的旋转措施(就像我的看图说词的例子)并且易于在最小的代码线中实现。
基本MNIST例子
每个版本(简单框架和高级框架)的步骤是相同的:
  1. 定义网络层
  2. 指定培训选项
  3. 火车网络
你可以跟随文档中的完整示例,它为每一行代码提供了更多的描述和解释。

加载数据

[XTrain, YTrain] = digitTrain4DArrayData;[XTest, YTest] = digitTest4DArrayData;类=类别(YTrain);numClasses =元素个数(类);

1.定义网络层

创建一个网络,由一系列简单的层组成。
layers = [imageInputLayer([28 28 1])卷积2dlayer (5,20,'Padding','same') batchNormalizationLayer reluLayer maxPooling2dLayer(2,'Stride',2) fulllyconnectedlayer (10) softmaxLayer classificationLayer];

2.指定培训选项

options = trainingOptions('sgdm',…“InitialLearnRate”,0.01,…“MaxEpochs”4…“阴谋”,“训练进步”);
这些都是简单的培训选择,并不一定是为了达到最好的效果。事实上,trainingOptions只需要您设置优化器,其余的可以使用默认值。

3.培训网络

网= trainNetwork (XTrain、YTrain层,选择);
很简单!现在让我们在扩展框架中做同样的事情。
扩展框架示例
同样的例子,只是使用扩展的框架,或者“DLNetwork”,我将继续使用这种方法。这是代码的修改版本。要跟随完整的示例,完整的代码位于DOC示例

加载数据

这是完全相同的,不需要显示重复代码。
现在,我们可以展示简单方法和DLNetwork方法之间的区别:让我们并排比较下面的每个步骤,以突出显示差异。

1.定义网络层

层是几乎同样:我们只需要为每个图层添加名称。这是在简单框架中显式处理的,但我们需要做更多的准备工作。
图层= [... imageinputlayer([28 28 1],'名称','输入','均值',均值(xtrain,4))卷积2dlayer(5,20,'name','conv1')rululayer('名称','relu1')maxpooling2dlayer(2,'stride',2,'name','pool1')全连接列(10,'name','fc')softmaxlayer('name','softmax')];
注意在层中,不再有分类层了。这将在训练循环中处理,因为这是我们想要定制的。
然后将层转换为layerGraph,这使得它们可以在自定义的训练循环中使用。同样,指定包含网络的dlnet结构。
Lgraph = LayerGraph(层);dlnet = dlnetwork(3);
DLnetwork具有图层和连接(可以处理课程或DAG网络)以及存储“学习依据”的地点。更稍后的更多。

2.指定培训选项

您会发现相当多的非可选参数明确定义:这些是您将在自定义训练循环中使用的参数。此外,我们不再可以选择了基本框架中的漂亮培训情节。
miniBatchSize = 128;numEpochs = 30;numObservations =元素个数(YTrain);numIterationsPerEpoch =地板(numObservations. / miniBatchSize);initialLearnRate = 0.01;动量= 0.9;executionEnvironment =“汽车”;韦尔= [];
您现在对自己的可视化负责,但这也意味着您可以在整个培训中创建自己的可视化,并根据您的喜好定制,以显示有助于理解网络的网络。 现在,让我们设置一个绘图,将丢失/错误显示为网络列车。
情节=“训练进步”;如果plot == "training-progress" figure lineLossTrain = animatedline;xlabel(“总迭代”)ylabel(“丢失”)结束

使用自定义训练循环训练网络

在进入训练循环之前,您需要知道的基础知识:
  • 一个时代是通过整个数据集进行一次迭代。因此,如果您有10个时期,则您正在运行所有文件10次。
  • 一种Mini-batch是数据集中较小的一块。数据集往往太大,无法同时放入内存或GPU,所以我们批量处理数据。
所以根据我们上面定义的参数,我们的自定义训练循环将遍历整个数据集30次,由于我们的小批量大小是128,我们的图像总数是5000,它将需要39次迭代来遍历数据1次。
这是自定义训练循环的结构。完整的代码在DOC示例,我会警告你完整的脚本是相当几行代码,但一旦你理解整体结构,它就很简单。
for epoch = 1:numEpochs…for ii = 1:numIterationsPerEpoch% *设置:读取数据,转换为dlarray,传递到GPU......%评估模型梯度和损耗[梯度,损失] = DLFeval(@Modelgradients,Dlnet,DLX,Y);%更新自定义学习速率learnRate = initialLearnRate/(1 +衰减*迭代);使用SGDM Optimizer更新网络参数[dlnet。= sgdmupdate(dlnet。学习性,梯度,vel,学习率,动量);%更新培训图......结束
为了完整起见,您创建了这个函数modelGradients在哪里定义渐变和损耗功能。更多关于下一篇文章中的细节。
function [gradient, loss] = modelGradients(dlnet, dlX, Y)loss = cross - sentropy(dlYPred, Y);gradient = dlgradient(loss, dlnet.Learnables);结束
在简单的例子中,一个函数trainnetwork已经扩展成一系列的循环和代码。我们这样做是为了在网络需要的时候,我们有更多的灵活性,当它过度破坏的时候,我们可以恢复到简单的方法。好消息是,这已经是最复杂的了:一旦你理解了这个结构,你就可以把正确的信息放进去了!
对于那些想要可视化循环中发生的事情的人,我看到的是这样的:
正如你可能已经猜到了基于突出显示在上面的可视化,本系列的下一篇文章将详细介绍循环的内部运作,和你需要知道的理解发生了什么损失,梯度、学习速率和更新网络参数。
三种模型的方法
要记住的最后一点是,在使用扩展框架时DLnetwork方法,还有一个模型函数当您还希望控制初始化和显式定义网络权重和偏差时,使用此方法。该示例还可以使用模型函数方法,您可以遵循此方法DOC示例要学习更多的知识。这种方法可以让您在3种方法中获得最大的控制,但也是最复杂的。
整个景观是这样的:
这篇文章就到这里。信息量很大,但希望你能从中找到一些有用的信息。如果你有任何问题或澄清,请在下方留言!
|
  • 打印
  • 发电子邮件

评论

要发表评论,请点击在这里登录您的MathWorks帐户或创建新的。