深度学习

理解和使用深度学习网络

高级深度学习:第1部分

建立任何深入学习网络
在接下来的几篇文章中,我希望大家都走出自己的舒适区。我将探索和展示更高级的深度学习主题。发行版19b引入了许多令人兴奋的新特性,我一直在犹豫是否要尝试这些特性,因为人们开始抛出一些术语,比如自定义训练循环、自动区分(如果你真的知道的话,甚至还有“autodiff”)。但我认为是时候深入探索新概念了,不仅要理解它们,还要理解在哪里以及为什么要使用它们。
在深度学习的基础上,有很多东西可以消化,所以我决定创建一系列帖子。您正在阅读的帖子现在将作为奠定基础和关键术语的温和介绍,然后是一系列查看各个网络类型(AutoEncoders,Siamese Networks,GAN和注意机制)的一系列帖子。
高级深度学习基础
首先,让我们从中开始为什么:“我为什么要使用扩展的深度学习框架?我直到现在很好。”首先,您获得灵活的培训结构,允许您在Matlab中创建任何网络。下一个帖子中的更复杂的结构需要扩展框架来解决:
  • 多个输入和输出
  • 定制的损失函数
  • 体重分享
  • 自动分化
  • 训练期间的特殊可视化
我将展示一个简单的深度学习榜样,然后重写它来使用扩展框架,即使它不需要它。为什么?因为当更复杂的例子来到时,我们已经知道了这个结构和该做什么。
让我们从一个我们都知道并喜欢的简单示例开始:MNIST。这个简单的手写例子有很多副产品(比如我的另外一个例子),并且易于在最少的代码行中实现。
基本MNIST例子
每个版本(简单框架和高级框架)的步骤将是相同的:
  1. 定义网络层
  2. 指定培训选项
  3. 列车网络的
你可以跟着文档中的完整示例,它提供了更多代码行的描述和解释。

加载数据

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

1.定义网络层

创建一个网络,由一系列简单的层组成。
图层= [ImageInputLayer([28 28 1])卷积2dlayer(5,20,'填充','相同')BatchnormalizationLayer ulleulayer MaxPooling2Dlayer(2,'stride',2)全连接层(10)SoftMaxLayer分类层];

2.指定培训选项

选项= TrainingOptions('sgdm',...'itiallearnrate',0.01,...'maxepochs',4,...'plots','培训 - 进展');
这些是简单的培训选项,不一定打算给出最佳结果。实际上,trainingOptions只需要您设置优化器,其余可以使用默认值。

3.训练网络

网= trainNetwork (XTrain、YTrain层,选择);
很简单!现在让我们在扩展框架中做同样的事情。
扩展框架的例子
相同的例子,只需使用扩展框架或“DLnetwork”,因为我将参考此方法前进。这是代码的修改版本。要与整个示例一起,完整代码是医生的例子

加载数据

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

1.定义网络层

几乎相同:我们只需要为每个图层添加名称。这是在简单的框架中明确处理,但我们需要做更多的前期工作。
层=[…imageInputLayer([28 28 1], 'Name',' input','Mean', Mean (Xtrain,4))卷积2dlayer (5, 20, 'Name',' conv1') reluLayer('Name', 'relu1') maxPooling2dLayer(2, 'Stride', 2, 'Name',' pool1') fulllyconnectedlayer (10, 'Name',' fc') softmaxLayer('Name','softmax')];
注意在图层中,不再有分类层。这将在训练循环中处理,因为这是我们想要自定义的。
然后将图层转换为分层图,这使得它们可以在自定义训练循环中使用。此外,指定包含网络的DLNET结构。
lgraph = layerGraph(层);dlnet = dlnetwork (lgraph);
dlnetwork具有层和连接等属性(可以处理Series或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次。
这是自定义训练循环的结构。完整的代码在医生的例子,我要提醒您,完整的脚本只有几行代码,但一旦您理解了整体结构,其中很多代码都很简单。
for epoch = 1:numEpochs…for ii = 1:numIterationsPerEpoch%*设置:读取数据,转换为dlarray,传递给GPU...%评估模型梯度和损失[gradient, loss] = dlfeval(@modelGradients, dlnet, dlX, Y);%更新自定义学习速率learnRate = initialLearnRate/(1 +衰减*迭代);%使用SGDM优化器更新网络参数[dlnet。= sgdmupdate(dlnet。学习性,梯度,vel,学习率,动量);%更新培训图...结束结束
为了完整起见,您创建了这个函数modelGradients这里定义了梯度和损失函数。更多细节将在下一篇文章中介绍。
function [gradient, loss] = modelGradients(dlnet, dlX, Y)loss = cross - sentropy(dlYPred, Y);gradient = dlgradient(loss, dlnet.Learnables);结束
在这个简单的例子中,有一个函数trainnetwork已经扩展成一系列的循环和代码。我们这样做是为了在网络需要的时候,我们有更多的灵活性,当它过度破坏的时候,我们可以恢复到简单的方法。好消息是,这已经是最复杂的了:一旦你理解了这个结构,你就可以把正确的信息放进去了!
对于那些想要可视化循环中发生的事情的人,我看到它是这样的:
正如你可能已经猜到了基于突出显示在上面的可视化,本系列的下一篇文章将详细介绍循环的内部运作,和你需要知道的理解发生了什么损失,梯度、学习速率和更新网络参数。
三种模型的方法
最后一点要记住,同时我用扩展框架DLNetwork方法,还有一个模型功能当您还希望控制初始化和明确定义网络权重和偏差时使用的方法。该示例还可以使用模型功能方法,您可以随之而来医生的例子要学习更多的知识。这种方法可以让您在3种方法中获得最大的控制,但也是最复杂的。
整个景观看起来像这样:
这是这篇文章。这是很多信息,但希望你在其中找到了一些信息。如果您有任何疑问或澄清,请在下面发表评论!
|
  • 打印
  • 发送电子邮件

评论

要留下评论,请点击在这里登录到您的MathWorks帐户或创建一个新帐户。