训练神经颂歌网络
这个例子展示了如何培养一个增广神经常微分方程(ODE)网络。
一个神经的颂歌1)是一种深度学习操作返回的颂歌的解决方案。特别是,给定一个输入,神经颂歌操作输出ODE的数值解 的时间范围 和初始条件 ,在那里 和 表示输入和ODE函数 是一组可学的参数。通常,初始条件 网络的输入或,在这个例子中,另一个深度学习操作的输出。
一个增强神经》(2)操作,从而提高在一个标准的神经颂歌增加额外的输入数据通道,然后丢弃后增加神经颂歌操作。经验,增强神经常微分方程更稳定,更好地推广,计算成本低于神经常微分方程。
这个例子火车一个简单的卷积神经网络与一个增广神经颂歌操作。
ODE函数可以深入学习操作的集合。在这个例子中,该模型使用一个convolution-tanh块作为ODE功能:
这个例子展示了如何训练一个神经网络分类的图像数字使用增强神经颂歌操作。
负荷训练数据
负荷训练图像和标签使用digitTrain4DArrayData
函数。
[XTrain, TTrain] = digitTrain4DArrayData;
视图类的培训数据的数量。
一会=类别(TTrain);numClasses =元素个数(类名)
numClasses = 10
从训练数据查看一些图像。
numObservations =大小(XTrain 4);idx = randperm (numObservations, 64);我= imtile (XTrain (:,:,:, idx));图imshow(我)
定义深度学习模型
定义以下网络分类图像。
convolution-ReLU块2 8 3 x3的过滤器的步伐
增加一步,连接一个数组的零输入通道的数量翻了一番
神经颂歌操作赋函数包含一块convolution-tanh 16 3 x3的过滤器
分类输出,一个完全连接操作10码(类)的数量和softmax操作
一个神经的颂歌操作输出指定的颂歌函数的解决方案。对于这个示例,指定一个convolution-tanh块作为ODE函数。
指定的颂歌函数 ,在那里 表示convolution-tanh操作, 是输入数据, 包含可学的卷积操作的参数。在这种情况下,变量 是未使用的。
定义并初始化模型参数
为每个操作的定义可学的参数,包括它们的结构。使用格式parameters.OperationName.ParameterName
,在那里参数
结构,啊perationName
是操作的名称(例如,“conv1”),然后呢ParameterName
参数的名称(例如,“权重”)。初始化可学的层使用的重量和偏见initializeGlorot
和initializeZeros
例子函数,分别。初始化实例函数附加到这个例子作为支持文件。金宝app访问这些功能,打开这个例子作为一个活的脚本。更多信息初始化函数可学的参数模型,明白了初始化函数可学的参数模型。
初始化参数结构。
参数=结构;
初始化参数第一卷积层。指定8 3 x3的过滤器。如果你改变这些维度,那么您必须手动计算的输入大小完全连接Glorot权重的初始化操作。
filterSize = 3 [3];numFilters = 8;numChannels =大小(XTrain, 3);深圳= [filterSize numChannels numFilters];numOut =刺激(filterSize) * numFilters;numIn =刺激(filterSize) * numFilters;parameters.conv1。重量= initializeGlorot(深圳、numOut numIn);parameters.conv1。偏见= initializeZeros ([numFilters 1]);
初始化参数用于神经颂歌函数的卷积运算。因为增加一步增加零的数组的输入数据,给出输入通道的数量numFilters + numExtraChannels
,在那里numExtraChannels
通道的数量在增加。同样,丢弃,因为模型的输出渠道神经颂歌操作相应增大,神经颂歌中的卷积操作必须(numChannels + numExtraChannels
)过滤器,numChannels
是所需的输出通道。
指定相同数量的卷积过滤器作为第一层和一个匹配的增加大小。
numChannels = numFilters;numExtraChannels = numFilters;numFiltersAugmented = numChannels + numExtraChannels;深圳= [filterSize numFiltersAugmented numFiltersAugmented];numOut =刺激(filterSize) * numFiltersAugmented;numIn =刺激(filterSize) * numFiltersAugmented;parameters.neuralode。重量= initializeGlorot(深圳、numOut numIn);parameters.neuralode。偏见= initializeZeros ([numFiltersAugmented 1]);
初始化参数完全连接操作。初始化的重量完全使用Glorot初始化连接操作,首先计算输入元素操作的数量。
为每个操作模型中,数据流经的大小变化,考虑输出尺寸当你28-by-28图像通过模型:
8第一卷积过滤器
“相同”
填充和2的步伐。这个操作输出14-by-14图像8通道。摘要介绍的模型然后增加数据零的数组。这个操作输出14-by-14图像16频道。
神经颂歌操作与16个过滤器和卷积操作
“相同”
填充。这个操作输出14-by-14图像16频道。相对应的模型然后丢弃渠道增加。这个操作输出14-by-14图像8通道。
这意味着输入元素的数量完全连接操作 。
深圳= 14 [14];inputSize =刺激(深圳)* numChannels;outputSize = numClasses;深圳= [outputSize inputSize];numOut = outputSize;numIn = inputSize;parameters.fc1。重量= initializeGlorot(深圳、numOut numIn);parameters.fc1。偏见= initializeZeros ([outputSize 1]);
视图的结构参数。
参数
参数=结构体字段:conv1:(1×1结构)neuralode: [1×1 struct] fc1: [1×1 struct]
查看参数神经颂歌操作。
parameters.neuralode
ans =结构体字段:重量:[3×3×16×16 dlarray]偏见:[16×1 dlarray]
定义模型超参数
定义的hyperparameters操作,包括它们的结构。使用格式hyperparameters.OperationName.ParameterName
在哪里hyperparameters
结构,啊perationName
是操作的名称(例如“neuralode”)和ParameterName
hyperparameter的名称(例如,“tspan”)。
初始化hyperparameters结构。
hyperparameters =结构;
神经的颂歌,指定一个区间[0 0.1]的集成。
hyperparameters.neuralode。tspan = 0.1 [0];
定义神经颂歌函数
创建函数odeModel
中列出,ODE函数部分的例子,以作为输入时输入(未使用),初始条件,ODE函数参数。函数的卷积运算,后跟一个双曲正切操作适用于输入数据使用的重量和偏见的参数。
定义模型函数
创建函数模型
中列出,模型函数部分的例子,计算深度学习模型的输出。这个函数模型
接受模型作为输入参数,输入数据。函数输出预测的标签。
定义模型损失函数
创建函数modelLoss
中列出,损失函数模型部分的示例中,将作为输入的模型参数和mini-batch输入数据与相应的目标包含标签,并返回损失和损失的梯度对可学的参数。
指定培训选项
指定培训选项。火车mini-batch大小64 30时代。
miniBatchSize = 64;numEpochs = 30;
火车模型
火车模型使用自定义训练循环。
创建一个minibatchqueue
对象流程和管理mini-batches图像在训练。创建一个minibatchqueue
对象,首先创建一个数据存储返回的图片和标签通过创建数组数据存储,然后结合。
dsXTrain = arrayDatastore (XTrain IterationDimension = 4);dsTTrain = arrayDatastore (TTrain);dsTrain =结合(dsXTrain dsTTrain);
创建mini-batch队列。为每个mini-batch:
使用自定义mini-batch预处理功能
preprocessMiniBatch
中定义的,Mini-Batch预处理功能部分的示例中,将标签编码的一个炎热的变量。格式的图像数据维度标签”
SSCB”
(空间、空间、通道、批)。默认情况下,minibatchqueue
把数据转换为对象dlarray
对象与基本类型单
。丢弃部分mini-batches。
火车在GPU如果一个是可用的。默认情况下,
minibatchqueue
将每个输出转换为对象gpuArray
如果一个GPU是可用的。使用GPU需要并行计算工具箱™和支持GPU设备。金宝app支持设备的信息,请参阅金宝appGPU计算的需求(并行计算工具箱)。
兆贝可= minibatchqueue (dsTrain,…MiniBatchSize = MiniBatchSize,…MiniBatchFcn = @preprocessMiniBatch,…MiniBatchFormat = [“SSCB”“CB”]);
初始化参数的移动平均梯度和梯度的element-wise广场由亚当优化器使用。
trailingAvg = [];trailingAvgSq = [];
更新进度条的培训进度监控,计算训练迭代的总数。
numIterationsPerEpoch =装天花板(numObservations / miniBatchSize);numIterations = numEpochs * numIterationsPerEpoch;
初始化TrainingProgressMonitor
对象。
监控= = trainingProgressMonitor(指标“损失”信息=“时代”包含=“迭代”);
火车模型使用自定义训练循环。对于每一个时代,洗牌数据。为每个mini-batch:
评估损失和梯度模型使用
dlfeval
和modelLoss
功能。更新网络参数使用
adamupdate
函数。更新培训进展阴谋。
迭代= 0;时代= 0;%循环时期。而时代< numEpochs & & ~班长。停止时代=时代+ 1;%洗牌数据。洗牌(兆贝可)%在mini-batches循环。而hasdata(兆贝可)& & ~班长。停止迭代=迭代+ 1;[X, T] =下一个(兆贝可);%计算模型和梯度使用dlfeval损失% modelLoss函数。(损失,梯度)= dlfeval (@modelLoss、参数X, T, hyperparameters);%更新使用亚当优化网络参数。(参数、trailingAvg trailingAvgSq) = adamupdate(参数、渐变…trailingAvg trailingAvgSq,迭代);%更新培训进度监控。recordMetrics(监控、迭代损失=损失);updateInfo(监视、时代=(时代+“的”+ numEpochs));班长。进步= 100 *(迭代/ numIterations);结束结束
测试模型
测试模型的分类精度比较了测试集上的预测与真正的标签。
负载测试数据。
(XTest, tt) = digitTest4DArrayData;
训练后,使预测新数据不需要标签。创建一个minibatchqueue
对象只包含测试数据的预测:
设置mini-batch队列的数量的输出为1。
指定相同的mini-batch大小用于培训。
预处理预测使用
preprocessPredictors
函数,列出的Mini-Batch预测预处理功能部分的例子。对于单一的输出数据存储,指定mini-batch格式”
SSCB”
(空间、空间、通道、批)。
dst = arrayDatastore (XTest IterationDimension = 4);mbqTest = minibatchqueue (dst, 1…MiniBatchSize = MiniBatchSize,…MiniBatchFormat =“SSCB”,…MiniBatchFcn = @preprocessPredictors);
遍历序列使用mini-batches和分类modelPredictions
函数,列出的模型的预测函数部分的例子。
YPred = modelPredictions(参数、hyperparameters mbqTest,类名);
可视化预测混淆矩阵。
YPred图confusionchart (tt)
模型函数
这个函数模型
使用模型作为输入参数,输入数据X
、模型hyperparameters和输出预测的标签。
这个图表列出了模型结构。
神经的颂歌操作,使用dlode45
功能和指定odeModel
函数,列出的ODE函数部分的例子。增加使用的绝对和相对宽容AbsoluteTolerance
和RelativeTolerance
名称-值参数,分别。计算梯度通过求解相关的伴随ODE体系,设置GradientMode
选项“伴随”
。
函数Y =模型(参数X, hyperparameters)%卷积,ReLU。重量= parameters.conv1.Weights;偏见= parameters.conv1.Bias;Y = dlconv (X,重量、偏见、填充=“相同”,步= 2);Y = relu (Y);%增加。重量= parameters.neuralode.Weights;numChannels =大小(Y, 3);szAugmented =大小(Y);szAugmented(3) =大小(重量、3)- numChannels;Y0 =猫(3 Y 0 (szAugmented,“喜欢”,Y));%神经的颂歌。tspan = hyperparameters.neuralode.tspan;Y = dlode45 (@odeModel tspan, Y0, parameters.neuralode,…GradientMode =“伴随”,…AbsoluteTolerance = 1 e - 3,…RelativeTolerance = 1的军医);%丢弃增大。Y (numChannels + 1:,::,:) = [];softmax %完全连接。重量= parameters.fc1.Weights;偏见= parameters.fc1.Bias;Y = fullyconnect (Y,重量,偏差);Y = softmax (Y);结束
ODE函数
神经颂歌操作由一个卷积操作了双曲正切操作。
ODE函数odeModel
作为输入函数的输入t
(未使用),y
和ODE函数参数p
包含卷积重量和偏见,并返回convolution-tanh块操作的输出。
函数z = odeModel (t y p)权重= p.Weights;偏见= p.Bias;z = dlconv (y,权重、偏见、填充=“相同”);z =双曲正切(z);结束
损失函数模型
的modelLoss
函数模型参数作为输入,mini-batch的输入数据X
与相应的目标T
模型hyperparameters,返回梯度的损失对可学的参数和相应的损失。计算梯度使用自动分化,使用dlgradient
函数。
函数(损失,梯度)= modelLoss(参数X, T, hyperparameters) Y =模型(参数X, hyperparameters);损失= crossentropy (Y, T);梯度= dlgradient(损失、参数);结束
模型的预测函数
的modelPredictions
函数作为输入参数的模型,模型hyperparameters, aminibatchqueue
的输入数据兆贝可
网络类,计算模型遍历所有数据的预测minibatchqueue
对象。这个函数使用onehotdecode
函数来找到预测类得分最高。
函数预测= modelPredictions(参数、hyperparameters兆贝可,一会)预测= [];而hasdata(兆贝可)X =(兆贝可);Y =模型(参数X, hyperparameters);Y = onehotdecode (Y,一会,1)';预测=[预测;Y);结束结束
Mini-Batch预处理功能
的preprocessMiniBatch
函数进行预处理的mini-batch预测和标签使用以下步骤:
使用预处理的图像
preprocessPredictors
函数。从传入单元阵列提取标签数据和连接到一个直言沿着二维数组。
一个炎热的分类标签编码成数字数组。编码的第一个维度产生一个相匹配的形状编码阵列网络输出。
函数[X, T] = preprocessMiniBatch (dataX人数()%预处理预测。X = preprocessPredictors (dataX);%从细胞中提取标签数据和连接。猫(T = 2,人数({});%一个炎热的编码标签。T = onehotencode (T, 1);结束
预测预处理功能
的preprocessPredictors
函数进行预处理mini-batch预测因子的提取图像数据从输入单元阵列和数据连接到数字数组。灰度输入,连接在第四维度添加了一个三维图像使用作为一个单通道尺寸。
函数X = preprocessPredictors (dataX) X =猫(4,dataX {:});结束
参考书目
陈,瑞奇·t·Q。,Yulia Rubanova, Jesse Bettencourt, and David Duvenaud. “Neural Ordinary Differential Equations.” Preprint, submitted June 19, 2018. https://arxiv.org/abs/1806.07366.
杜邦、Emilien Arnaud下去,绮Whye格兰。“增强神经常微分方程。“预印本,提交2019年10月26日。https://arxiv.org/abs/1904.01681。
另请参阅
dlode45
|dlarray
|dlgradient
|dlfeval
|adamupdate