训练序列分类网络使用自定义训练循环
这个例子展示了如何训练网络,分类序列与一个定制的学习速率的时间表。
你可以训练使用的大多数类型的神经网络trainNetwork
和trainingOptions
功能。如果trainingOptions
函数不提供你需要的选项(例如,一个定制的学习速率的时间表),然后你可以定义自己的自定义训练循环使用dlarray
和dlnetwork
对象自动分化。为一个例子,演示如何训练序列的卷积神经网络分类使用trainNetwork
功能,请参阅使用一维卷积序列分类。
训练一个网络定制培训循环序列数据需要一些额外的处理步骤相比,图像或特征数据。大多数深度学习的功能需要与一个固定的数据作为数字传递数组序列长度。如果你有序列数据,观测不同长度,那么你必须垫或截断序列在每个mini-batch以便他们有相同的长度。
这个例子训练一个网络分类的序列基于时间的衰减学习速率的时间表:对于每一次迭代,求解器使用的学习速率 ,在那里t是迭代数, 最初的学习速率,k是衰减的。
负荷训练数据
加载波形数据集WaveformData.mat
。观察是numChannels
——- - - - - -numTimeSteps
数组,numChannels
和numTimeSteps
通道的数量和时间的步骤序列,分别。序列有不同的长度。
负载WaveformData
视图的大小头几个序列。
数据(1:5)
ans =5×1单元阵列{3×103双}{3×136双}{3×140双}{3×124双}{3×127双}
视图通道的数量。训练网络,每个序列必须有相同数量的渠道。
{1}numChannels =大小(数据,1)
numChannels = 3
可视化最初几个序列在一个阴谋。
图tiledlayout (2, 2)为i = 1:4 nexttile stackedplot(数据{我}’,DisplayLabels =“通道”+ (1:numChannels));标题(“观察”+我+换行符+”类:“+字符串(标签(i)))包含(“时间步”)结束
确定训练数据的类的数量。
类=类别(标签);numClasses =元素个数(类);
分区数据为训练和测试的分区。使用90%的数据训练网络,留出10%进行测试。
numObservations =元素个数(数据);idxTrain = 1:地板(0.9 * numObservations);XTrain =数据(idxTrain);TTrain =标签(idxTrain);idxTest =地板(0.9 * numObservations) + 1: numObservations;XTest =数据(idxTest);tt =标签(idxTest);
定义网络
定义网络序列分类。
序列的输入,指定一个序列输入层与输入训练数据的大小匹配通道的数量。
指定三个convolution-layernorm-ReLU块。
垫卷积的输入层,通过设置的输出具有相同的大小
填充
选项“相同”
。卷积第一层指定20过滤器的大小5。
池的步伐使用一维单个值全球平均池层。
对于分类,指定一个完全连接层与大小匹配的类的数量
输出映射到概率,包括softmax层。
当培训网络使用自定义循环,不包括一个输出层。
层= [sequenceInputLayer numChannels convolution1dLayer(填充= 5,20日“相同”)layerNormalizationLayer reluLayer convolution1dLayer(5、20、填充=“相同”)layerNormalizationLayer reluLayer convolution1dLayer(5、20、填充=“相同”)layerNormalizationLayer reluLayer globalAveragePooling1dLayer fullyConnectedLayer (numClasses) softmaxLayer];
创建一个dlnetwork
数组对象的层。
净= dlnetwork(层)
网= dlnetwork属性:层:[13×1 nnet.cnn.layer.Layer]连接:[12×2表]可学的:[14×3表]状态:[0×3表]InputNames: {“sequenceinput”} OutputNames: {“softmax”}初始化:1观点总结总结。
定义模型损失函数
训练一个深层神经网络是一种优化的任务。通过考虑一个神经网络作为一个函数 ,在那里 网络的输入, 可学的参数集,您可以优化吗 减少一些损失值基于训练数据。例如,优化可学的参数 这样,对于一个给定的输入 与相应的目标 ,他们之间的误差最小化预测 和 。
创建函数modelLoss
中列出,损失函数模型的例子中,这需要作为输入dlnetwork
对象,mini-batch输入数据与相应的目标,并返回损失,损失的梯度对可学的参数,和网络状态。
指定培训选项
火车60时代mini-batch大小为128。
numEpochs = 60;miniBatchSize = 128;
指定的选项为亚当的优化。指定一个初始学习0.005的衰变率0.01。
initialLearnRate = 0.005;learnRateDecay = 0.01;
火车模型
创建一个minibatchqueue
对象的数据流程和管理mini-batches在训练。
Mini-batch队列对象需要数据指定为数据存储。序列和标签转换为数组数据存储,它们结合起来使用结合
函数。单元阵列的输出序列数值数组,指定的输出类型“相同”
序列数据。
adsXTrain = arrayDatastore (XTrain OutputType =“相同”);adsTTrain = arrayDatastore (TTrain);cdsTrain =结合(adsXTrain adsTTrain);
创建一个minibatchqueue
对象的数据流程和管理mini-batches在训练。为每个mini-batch:
使用自定义mini-batch预处理功能
preprocessMiniBatch
(在这个例子中定义)垫序列有相同的长度和编码的标签转换为一个炎热的变量。格式的序列数据维度标签
“施”
(通道、时间、批次)。默认情况下,minibatchqueue
把数据转换为对象dlarray
对象与基本类型单
。没有格式的类标签。火车在GPU如果一个是可用的。默认情况下,
minibatchqueue
将每个输出转换为对象gpuArray
如果一个GPU是可用的。使用GPU需要并行计算工具箱™和支持GPU设备。金宝app支持设备的信息,请参阅金宝appGPU计算的需求(并行计算工具箱)。
兆贝可= minibatchqueue (cdsTrain,…MiniBatchSize = MiniBatchSize,…MiniBatchFcn = @preprocessMiniBatch,…MiniBatchFormat = [“施””“]);
初始化平均梯度和亚当的平均平方梯度参数解算器。
averageGrad = [];averageSqGrad = [];
计算迭代的总数的培训进度监控。
numObservationsTrain =大小(XTrain, 1);numIterationsPerEpoch =装天花板(numObservationsTrain / miniBatchSize);numIterations = numEpochs * numIterationsPerEpoch;
初始化TrainingProgressMonitor
对象。因为计时器开始创建监视器对象时,确保你创建对象接近的训练循环。
监控= trainingProgressMonitor (…指标=“损失”,…信息= [“时代”,“LearnRate”),…包含=“迭代”);
列车网络使用自定义训练循环。对于每一个时代,洗牌和遍历mini-batches数据的数据。为每个mini-batch:
评估损失和梯度模型使用
dlfeval
和modelLoss
功能。确定基于时间的学习速率衰减学习速率的时间表。
更新网络参数使用
adamupdate
函数。更新损失,学习速度,训练进度监控和时代价值。
停止,如果停止房地产是正确的。的
停止
属性值的TrainingProgressMonitor
真当你点击对象变化停止按钮。
时代= 0;迭代= 0;%循环时期。而时代< numEpochs & & ~班长。停止时代=时代+ 1;%洗牌数据。洗牌(兆贝可);%在mini-batches循环。而hasdata(兆贝可)& & ~班长。停止iteration = iteration + 1;% mini-batch读取的数据。[X, T] =下一个(兆贝可);%计算模型使用dlfeval和梯度和损失% modelLoss函数。(损失,梯度)= dlfeval (@modelLoss,净,X, T);%确定为基于时间的学习速率衰减学习速率的时间表。learnRate = initialLearnRate / (1 + learnRateDecay *迭代);%更新使用亚当优化网络参数。[净,averageGrad averageSqGrad] = adamupdate(净、渐变…averageGrad averageSqGrad,迭代,learnRate);%更新培训进度监控。recordMetrics(监控、迭代损失=损失);updateInfo(监控、时代=时代LearnRate = LearnRate);班长。进步= 100 *迭代/ numIterations;结束结束
测试模型
测试模型的分类精度和测试集上的预测目标。
训练后,使预测新数据不需要标签。创建minibatchqueue
对象只包含测试数据的预测:
指定相同的mini-batch大小用于培训。
预处理预测使用
preprocessMiniBatchPredictors
函数,列出的例子。对于单一的输出数据存储,指定mini-batch格式
“施”
(通道、时间、批次)。
adsXTest = arrayDatastore (XTest OutputType =“相同”);mbqTest = minibatchqueue (adsXTest,…MiniBatchSize = MiniBatchSize,…MiniBatchFcn = @preprocessMiniBatchPredictors,…MiniBatchFormat =“施”);
遍历序列使用mini-batches和分类modelPredictions
函数,列出的例子。
欧美= modelPredictions(净、mbqTest、类);
评估分类精度。
精度=意味着(tt = =次)
精度= 0.8200
图表可视化预测在一个混乱。
次图confusionchart (tt)
大值对应的类的对角线显示准确的预测。大值对应的类之间的非对角的表示强烈的困惑。
金宝app支持功能
损失函数模型
的modelLoss
函数接受一个dlnetwork
对象净
mini-batch的输入数据X
与相应的目标T
并返回损失和损失的梯度参数对可学的净
。自动计算梯度,使用dlgradient
函数。
函数(损失,梯度)= modelLoss(净,X, T)%通过网络转发数据。Y =前进(净,X);%计算熵的损失。损失= crossentropy (Y, T);%计算梯度的损失对可学的参数。梯度= dlgradient(损失、net.Learnables);结束
模型的预测函数
的modelPredictions
函数接受一个dlnetwork
对象净
,一个minibatchqueue
的输入数据兆贝可
网络类,计算模型遍历所有数据的预测minibatchqueue
对象。这个函数使用onehotdecode
函数找到预测类最高的分数。
函数Y = modelPredictions(净、兆贝可类)Y = [];%在mini-batches循环。而hasdata(兆贝可)X =(兆贝可);%进行预测。成绩=预测(净,X);%解码标签和附加到输出。标签= onehotdecode(成绩、类1)';Y = [Y;标签);结束结束
小批预处理功能
的preprocessMiniBatch
函数进行预处理的mini-batch预测和标签使用以下步骤:
预处理的序列使用
preprocessMiniBatchPredictors
函数。从传入单元阵列提取标签数据和连接到一个直言沿着二维数组。
一个炎热的分类标签编码成数字数组。编码的第一个维度产生一个相匹配的形状编码阵列网络输出。
函数[X, T] = preprocessMiniBatch (dataX人数()%预处理预测。X = preprocessMiniBatchPredictors (dataX);%从细胞中提取标签数据和连接。猫(T = 2,人数({1:结束});%一个炎热的编码标签。T = onehotencode (T, 1);结束
Mini-Batch预测预处理功能
的preprocessMiniBatchPredictors
的预测函数进行预处理mini-batch填充序列数据输入单元阵列中的第二个维度(时间)。作为一个函数返回数据numChannels
——- - - - - -numTimeSteps
——- - - - - -numObservations
数组中。将此信息传递给下游功能,指定该数据的格式“施”
(通道、时间、批次)。
函数X = preprocessMiniBatchPredictors (dataX)%垫序列。X = padsequences (dataX 2);结束
另请参阅
trainingProgressMonitor
|dlarray
|dlgradient
|dlfeval
|dlnetwork
|向前
|adamupdate
|预测
|minibatchqueue
|onehotencode
|onehotdecode