深度学习

理解和使用深度学习网络

高级深度学习:第1部分

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

加载数据

[XTrain,YTrain]=数字列车4DRARAYDATA;[XTest,YTest]=Digittest4ArrayData;类别=类别(YTrain);numClasses=numel(类);

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…“阴谋”,“训练进步”);
这些都是简单的培训选择,并不一定是为了达到最好的效果。事实上,培训选项只需要设置优化器,其余部分可以使用默认值。

3.培训网络

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

加载数据

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

1.定义网络层

层是几乎同样:我们只需要为每个图层添加名称。这是在简单框架中显式处理的,但我们需要做更多的准备工作。
layers=[…imageInputLayer([28 28 28 1],'Name','input','Mean',Mean(Xtrain,4))卷积2dLayer(5,20,'Name','conv1')reluLayer('Name','relu1')MaxPoolg2dLayer(2,'Stride',2,'Name','pool1')fullyConnectedLayer(10,'Name','fc')softmaxLayer('Name','softmax');
注意在层中,不再有分类层了。这将在训练循环中处理,因为这是我们想要定制的。
然后将层转换为layerGraph,这使得它们可以在自定义的训练循环中使用。同样,指定包含网络的dlnet结构。
lgraph=层Graph(层);dlnet=dlnetwork(lgraph);
dlnetwork具有层和连接(可以处理系列或DAG网络)等属性,还具有存储“可学习内容”的位置。稍后将对此进行详细介绍。

2.指定培训选项

你会注意到还有很多非可选的参数被明确定义:这些是你将在自定义训练循环中使用的参数。此外,我们不再有像基本框架中那样的漂亮训练图的选项。
miniBatchSize=128;numEpochs=30;numObservations=numel(YTrain);NumIteOptionSperepoch=floor(numObservations./miniBatchSize);initialLearnRate=0.01;momentum=0.9;executionEnvironment=“auto”;vel=[];
您现在负责自己的可视化,但这也意味着您可以在整个培训过程中创建自己的可视化,并根据自己的喜好进行定制,以显示有关网络的任何信息,这将有助于在培训过程中了解网络。 现在,让我们设置一个绘图,将丢失/错误显示为网络列车。
plots=“training progress”;如果plots==“training progress”图lineLossTrain=animatedline;xlabel(“总迭代次数”)ylabel(“损失”)结束

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

进入培训循环前需要了解的基本知识:
  • 纪元是对整个数据集的一次迭代。因此,如果您有10个纪元,那么您将对所有文件运行10次。
  • A.小批量是数据集中较小的一块。数据集往往太大,无法同时放入内存或GPU,所以我们批量处理数据。
因此,根据我们上面定义的参数,我们的自定义训练循环将在整个数据集中循环30次,由于我们的小批量大小是128,图像总数是5000,因此需要39次迭代才能在数据集中循环1次。
这是自定义训练循环的结构文档示例,我要警告您,完整的脚本需要相当多的代码行,但是一旦您理解了总体结构,很多代码都是简单明了的。
对于历元=1:numEpochs…对于ii=1:numIterationsPerEpoch% *设置:读取数据,转换为dlarray,传递到GPU...%评估模型梯度和损失[梯度,损失]=dlfeval(@modelGradients,dlnet,dlX,Y);%更新自定义学习速率learnRate=初始learnRate/(1+衰减*迭代);%使用SGDM优化器更新网络参数[dlnet.Learnables,vel]=sgdmupdate(dlnet.Learnables,梯度,vel,learnRate,动量);%更新训练图…结束
为了完整性,您需要创建函数模型梯度在这里你可以定义梯度和损失函数。更多细节将在下一篇文章中介绍。
函数[梯度,损失]=模型梯度(dlnet,dlX,Y)dlYPred=正向(dlnet,dlX);损失=交叉熵(dlYPred,Y);梯度=dlgradient(损失,dlnet.Learnables);结束
在这个简单的例子中,一个函数列车网络已扩展为一系列循环和代码。我们这样做是为了在网络需要时具有更大的灵活性,并且在过度使用时,我们可以返回到更简单的方法。好消息是,这是非常复杂的:一旦您了解此结构,就要将正确的信息放入其中!
对于那些想要可视化循环中发生的事情的人,我看到的是这样的:
正如你可能已经猜到的,基于上面的可视化中突出显示的内容,本系列的下一篇文章将更详细地介绍循环的内部工作,以及你需要知道的,以了解损失、梯度、学习率和更新网络参数的情况。
三种模型方法
要记住的最后一点是,在使用扩展框架时DLN网络方法,还有一个模型函数当您还希望控制初始化和显式定义网络权重和偏差时,使用此方法。该示例还可以使用模型函数方法,您可以遵循此方法文档示例要了解更多信息,此方法为您提供了三种方法中控制最多的方法,但也是最复杂的方法。
整个景观是这样的:
这篇文章就到这里。信息量很大,但希望你能从中找到一些有用的信息。如果你有任何问题或澄清,请在下方留言!
|

评论

如需留言,请点击在这里登录到您的MathWorks帐户或创建新帐户。