主要内容gydF4y2Ba

使用一维卷积的序列到序列分类gydF4y2Ba

这个例子展示了如何使用一个通用的时间卷积网络(TCN)对序列数据的每个时间步骤进行分类。gydF4y2Ba

虽然序列到序列的任务通常用循环神经网络结构来解决,但Bai等人[1]的研究表明,卷积神经网络在典型的序列建模任务上可以与循环神经网络的性能相匹配,甚至超过循环神经网络。使用卷积网络的潜在好处是更好的并行性,更好地控制接收域大小,更好地控制训练过程中网络的记忆足迹,以及更稳定的梯度。就像循环网络一样,卷积网络可以在可变长度的输入序列上运行,并可以用于序列到序列或序列到一的任务建模。gydF4y2Ba

本例使用佩戴在身上的智能手机获取的传感器数据,并使用自定义训练循环和自动区分训练时间卷积网络作为函数,以识别佩戴者的活动,给定时间序列数据代表三个不同方向的加速度计读数。gydF4y2Ba

负荷训练数据gydF4y2Ba

加载人体活动识别数据。该数据包含从佩戴在身上的智能手机获取的七个传感器数据时间序列。每个序列有三个特征,长度不同。这三个特征对应于三个不同方向的加速度计读数。六个序列用于训练,一个序列用于测试训练后的测试。gydF4y2Ba

s =负载(gydF4y2Ba“HumanActivityTrain.mat”gydF4y2Ba);dsXTrain = arrayDatastore (s。XTrain,gydF4y2Ba“OutputType”gydF4y2Ba,gydF4y2Ba“一样”gydF4y2Ba);dsYTrain = arrayDatastore (s。YTrain,gydF4y2Ba“OutputType”gydF4y2Ba,gydF4y2Ba“一样”gydF4y2Ba);dsTrain =结合(dsXTrain dsYTrain);gydF4y2Ba

确定培训数据中的观察次数和班级数量。gydF4y2Ba

numObservations =元素个数(s.XTrain);类=类别(s.YTrain {1});numClasses =元素个数(类);gydF4y2Ba

在绘图中可视化一个训练序列。绘制第一个训练序列的第一个特征,并根据相应的活动给绘图上色。gydF4y2Ba

X = s.XTrain {1} (1:);数字gydF4y2Ba为gydF4y2BaJ = 1:numel(classes) label = class (J);idx =找到(s。YTrain{1} = =标签);持有gydF4y2Ba在…上gydF4y2Ba情节(idx X (idx))gydF4y2Ba结束gydF4y2Ba持有gydF4y2Ba从gydF4y2Ba包含(gydF4y2Ba“时间步”gydF4y2Ba)伊拉贝尔(gydF4y2Ba“加速”gydF4y2Ba)标题(gydF4y2Ba“训练序列1,功能1”gydF4y2Ba)传说(类,gydF4y2Ba“位置”gydF4y2Ba,gydF4y2Ba“西北”gydF4y2Ba)gydF4y2Ba

定义深度学习模型gydF4y2Ba

时间卷积网络的主要组成部分是一个扩展的因果卷积层,它在每个序列的时间步骤上进行操作。在这种情况下,“因果”意味着为特定时间步计算的激活不能依赖于未来时间步的激活。gydF4y2Ba

为了从之前的时间步骤构建上下文,通常会将多个卷积层堆叠在一起。为了实现较大的接收域大小,后续卷积层的膨胀系数呈指数级增加,如下图所示。假设第k个卷积层的膨胀因子为gydF4y2Ba 2gydF4y2Ba (gydF4y2Ba kgydF4y2Ba -gydF4y2Ba 1gydF4y2Ba )gydF4y2Ba 而步幅为1,则该网络的接受域大小可计算为gydF4y2Ba RgydF4y2Ba =gydF4y2Ba (gydF4y2Ba fgydF4y2Ba -gydF4y2Ba 1gydF4y2Ba )gydF4y2Ba (gydF4y2Ba 2gydF4y2Ba KgydF4y2Ba -gydF4y2Ba 1gydF4y2Ba )gydF4y2Ba +gydF4y2Ba 1gydF4y2Ba ,在那里gydF4y2Ba fgydF4y2Ba 是过滤器的大小和尺寸gydF4y2Ba KgydF4y2Ba 为卷积层的数量。改变过滤器的大小和层数,以方便地调整接收字段的大小和数量或可学习的参数为必要的数据和手头的任务。gydF4y2Ba

与rnn相比,tcn的缺点之一是推断时占用的内存更多。整个原始序列需要计算下一个时间步长。为了减少推理时间和记忆消耗,特别是对于超前预测,用最小的感觉接受域进行训练是有益的gydF4y2Ba RgydF4y2Ba 只对最后一个进行预测gydF4y2Ba RgydF4y2Ba 输入序列的时间步长。gydF4y2Ba

一般的TCN架构(如[1]所述)由多个残差块组成,每个残差块包含两组扩展的因果卷积层,具有相同的扩展因子,然后是归一化、ReLU激活和空间退出层。每个块的输入被添加到块的输出(包括当输入和输出之间的通道数量不匹配时对输入进行1乘1的卷积),并应用最终的激活函数。gydF4y2Ba

定义和初始化模型参数gydF4y2Ba

为TCN架构指定参数,该架构有4个残余块,其中包含扩展的因果卷积层,每个层有175个大小为3的滤波器。gydF4y2Ba

numBlocks = 4;numFilters = 175;filterSize = 3;dropoutFactor = 0.05;gydF4y2Ba

要将模型超参数传递给模型函数(块的数量和dropout因子),创建一个包含这些值的结构。gydF4y2Ba

hyperparameters =结构;hyperparameters。NumBlocks = numBlocks; hyperparameters.DropoutFactor = dropoutFactor;

创建一个包含gydF4y2BadlarraygydF4y2Ba对象用于模型的所有可学习参数,这些参数基于输入通道的数量和定义模型体系结构的超参数。每个残差块都需要两个卷积运算的权值参数和偏差参数。第一个剩余块通常还需要一个滤波器大小为1的额外卷积操作的权重和偏差。最后的全连通操作也需要一个权值和偏置参数。使用函数初始化可学习的层权重gydF4y2Ba初始化高斯语gydF4y2Ba,列在示例末尾。用零初始化可学习的层偏差。gydF4y2Ba

numInputChannels = 3;参数=结构;numChannels = numInputChannels;gydF4y2Ba为gydF4y2Bak=1:numBlocks参数block=struct;blockName=gydF4y2Ba“块”gydF4y2Ba+ k;weights = initializeGaussian([filterSize, numChannels, numFilters]);bias = 0 (numFilters, 1,gydF4y2Ba“单一”gydF4y2Ba);parametersBlock.Conv1。重量= dlarray(重量);parametersBlock.Conv1。偏见= dlarray(偏差);weights = initializeGaussian([filterSize, numFilters, numFilters]);bias = 0 (numFilters, 1,gydF4y2Ba“单一”gydF4y2Ba);参数sblock.Conv2.Weights=dlarray(Weights);参数sblock.Conv2.Bias=dlarray(Bias);gydF4y2Ba%如果块的输入和输出有不同的数量gydF4y2Ba%通道,然后添加滤波器大小为1的卷积。gydF4y2Ba如果gydF4y2BanumChannels ~= numFilters weights = initializeGaussian([1, numChannels, numFilters]);bias = 0 (numFilters, 1,gydF4y2Ba“单一”gydF4y2Ba);parametersBlock.Conv3。重量= dlarray(重量);parametersBlock.Conv3。偏见= dlarray(偏差);gydF4y2Ba结束gydF4y2BanumChannels=numFilters;parameters.(blockName)=parametersBlock;gydF4y2Ba结束gydF4y2Ba重量= initializeGaussian ([numClasses numChannels]);偏见= 0 (numClasses 1gydF4y2Ba“单一”gydF4y2Ba);parameters.FC.Weights = dlarray(重量);parameters.FC.Bias = dlarray(偏差);gydF4y2Ba

查看网络参数。gydF4y2Ba

参数gydF4y2Ba
参数=gydF4y2Ba结构体字段:gydF4y2Ba块1:[1×1结构]块2:[1×1结构]块3:[1×1结构]块4:[1×1结构]FC:[1×1结构]gydF4y2Ba

查看第一个块的参数。gydF4y2Ba

参数。Block1gydF4y2Ba
ans =gydF4y2Ba结构体字段:gydF4y2BaConv1:[1×1结构]Conv2:[1×1结构]Conv3:[1×1结构]gydF4y2Ba

查看第一个块的第一个卷积运算的参数。gydF4y2Ba

parameters.Block1.Conv1gydF4y2Ba
ans =gydF4y2Ba结构体字段:gydF4y2Ba权重:[3×3×175 dlarray]偏见:[175×1 dlarray]gydF4y2Ba

定义模型和模型梯度功能gydF4y2Ba

创建函数gydF4y2Ba模型gydF4y2Ba,列于gydF4y2Ba模型函数gydF4y2Ba部分,计算深度学习模型的输出。功能gydF4y2Ba模型gydF4y2Ba获取输入数据、可学习模型参数、模型超参数和一个标志,该标志指定模型应该返回用于训练或预测的输出。网络在输入序列的每个时间步长输出标签的预测。gydF4y2Ba

创建函数gydF4y2BamodelGradientsgydF4y2Ba,列于gydF4y2Ba模型梯度函数gydF4y2Ba部分,该部分取一小批输入数据、相应的目标序列和网络的参数,并返回相对于可学习参数和相应损失的梯度。gydF4y2Ba

指定培训选项gydF4y2Ba

指定自定义训练循环中使用的一组训练选项。gydF4y2Ba

  • 培训30个时代,最小批量为1。gydF4y2Ba

  • 初始学习率为0.001gydF4y2Ba

  • 每12个纪元乘以0.1。gydF4y2Ba

  • 使用gydF4y2Ba lgydF4y2Ba 2gydF4y2Ba 阈值为1的Norm。gydF4y2Ba

maxEpochs=30;miniBatchSize=1;initialLearnRate=0.001;learnRateDropFactor=0.1;learnRateDropPeriod=12;gradientThreshold=1;gydF4y2Ba

要监控培训进度,可以在每次迭代后绘制培训损失。创建变量gydF4y2Ba阴谋gydF4y2Ba包含gydF4y2Ba“培训进度”gydF4y2Ba。如果不希望绘制培训进度,请将此值设置为gydF4y2Ba“没有”gydF4y2Ba.gydF4y2Ba

情节=gydF4y2Ba“培训进度”gydF4y2Ba;gydF4y2Ba

列车模型gydF4y2Ba

通过在训练数据集中的序列上循环,计算参数梯度,并通过Adam更新规则更新网络参数,通过随机梯度下降训练网络。这个过程重复多次(称为gydF4y2Ba时代gydF4y2Ba),直到训练收敛并达到最大纪元数为止。gydF4y2Ba

使用gydF4y2Ba小型批处理队列gydF4y2Ba在培训过程中处理和管理小批量的图像。为每个mini-batch:gydF4y2Ba

  • 使用自定义小批量预处理功能gydF4y2BapreprocessMiniBatchgydF4y2Ba(在本例的最后定义)来预处理序列数据,确定时间步骤的数量,并一次性对类标签进行编码。函数有三个输出,因此指定三个输出变量gydF4y2Ba小型批处理队列gydF4y2Ba.gydF4y2Ba

  • 将数据转换为未格式化的gydF4y2BadlarraygydF4y2Ba基础类型为single的对象。gydF4y2Ba

  • 在可用的GPU上进行训练。默认情况下,gydF4y2Ba小型批处理队列gydF4y2Ba对象将每个输出转换为gydF4y2BagpuArraygydF4y2Ba如果有可用的GPU。使用GPU需要并行计算工具箱™和支持CUDA®的NVIDIA®GPU,其计算能力为3.0或更高。gydF4y2Ba

mbq=小型批处理队列(dsTrain,3,gydF4y2Ba...gydF4y2Ba“MiniBatchSize”gydF4y2BaminiBatchSize,gydF4y2Ba...gydF4y2Ba“MiniBatchFcn”gydF4y2Ba小批量);gydF4y2Ba

对于每个纪元,洗牌训练数据。为每个mini-batch:gydF4y2Ba

  • 使用以下方法评估模型坡度和损失:gydF4y2BadlfevalgydF4y2Ba和gydF4y2BamodelGradientsgydF4y2Ba函数。gydF4y2Ba

  • 如果渐变太大,请使用该函数剪辑渐变gydF4y2BathresholdL2NormgydF4y2Ba,列在示例末尾,以及gydF4y2BadlupdategydF4y2Ba函数。gydF4y2Ba

  • 使用gydF4y2BaadamupdategydF4y2Ba函数。gydF4y2Ba

  • 更新培训进度图。gydF4y2Ba

在完成gydF4y2BalearnRateDropPeriodgydF4y2Baepoch,通过将当前的学习速率乘以来降低学习速率gydF4y2BalearnRateDropFactorgydF4y2Ba.gydF4y2Ba

初始化学习率,该学习率将乘以gydF4y2BaLearnRateDropFactorgydF4y2Ba每一个值gydF4y2BaLearnRateDropPeriodgydF4y2Ba时代的发展。gydF4y2Ba

learnRate=初始learnRate;gydF4y2Ba

初始化参数梯度的移动平均值和Adam优化器使用的梯度的元素方。gydF4y2Ba

trailingAvg = [];trailingAvgSq = [];gydF4y2Ba

初始化显示训练进度的图表。gydF4y2Ba

如果gydF4y2Ba情节= =gydF4y2Ba“培训进度”gydF4y2Bafigure lineLossTrain=动画线(gydF4y2Ba“颜色”gydF4y2Ba[0.85 0.325 0.098]);ylim([0正])包含(gydF4y2Ba“迭代”gydF4y2Ba)伊拉贝尔(gydF4y2Ba“损失”gydF4y2Ba网格)gydF4y2Ba在…上gydF4y2Ba结束gydF4y2Ba

火车模型。gydF4y2Ba

迭代= 0;开始=抽搐;gydF4y2Ba%循环纪元。gydF4y2Ba为gydF4y2Ba时代= 1:maxEpochsgydF4y2Ba%洗牌数据。gydF4y2Ba洗牌(兆贝可)gydF4y2Ba%循环小批。gydF4y2Ba虽然gydF4y2BaHasdata (mbq) iteration = iteration + 1;[dlX,海底,numTimeSteps] =下一个(兆贝可);gydF4y2Ba%使用dlfeval评估模型梯度和损失。gydF4y2Ba[gradients,loss]=dlfeval(@modelGradients,dlX,dlY,parameters,hyperparameters,numTimeSteps);gydF4y2Ba%剪辑渐变。gydF4y2Bagradient = dlupdate(@(g) thresholdL2Norm(g,gradientThreshold),gradient);gydF4y2Ba%使用Adam优化器更新网络参数。gydF4y2Ba(参数、trailingAvg trailingAvgSq) = adamupdate(参数、渐变gydF4y2Ba...gydF4y2BatrailingAvg,trailingAvgSq,迭代,learnRate);gydF4y2Ba如果gydF4y2Ba情节= =gydF4y2Ba“培训进度”gydF4y2Ba%绘制训练进度图。gydF4y2BaD=持续时间(0,0,toc(开始),gydF4y2Ba“格式”gydF4y2Ba,gydF4y2Ba“hh: mm: ss”gydF4y2Ba);gydF4y2Ba将序列长度上的损失归一化gydF4y2Ba损耗=平均值(损耗。/numTimeSteps);损耗=双精度(采集(提取数据(损耗));损耗=平均值(损耗);添加点(lineLossTrain,迭代,平均值(损耗));标题(gydF4y2Ba“时代:”gydF4y2Ba+时代+gydF4y2Ba”,过去:“gydF4y2Ba+字符串(D)现在开始gydF4y2Ba结束gydF4y2Ba结束gydF4y2Ba%在learnRateDropPeriod后降低学习率gydF4y2Ba如果gydF4y2Bamod(epoch,learnRateDropPeriod) == 0gydF4y2Ba结束gydF4y2Ba结束gydF4y2Ba

测试模型gydF4y2Ba

通过比较每个时间步的真实标签在保留测试集上的预测来检验模型的分类精度。使用控件管理测试数据集gydF4y2Ba小型批处理队列gydF4y2Ba对象的设置与训练数据相同。gydF4y2Ba

s =负载(gydF4y2Ba“HumanActivityTest.mat”gydF4y2Ba);dsXTest = arrayDatastore (s。XTest,gydF4y2Ba“OutputType”gydF4y2Ba,gydF4y2Ba“一样”gydF4y2Ba);dsYTest = arrayDatastore (s。欧美,gydF4y2Ba“OutputType”gydF4y2Ba,gydF4y2Ba“一样”gydF4y2Ba);dst =结合(dsXTest dsYTest);mbqTest = minibatchqueue (dst 3gydF4y2Ba...gydF4y2Ba“MiniBatchSize”gydF4y2BaminiBatchSize,gydF4y2Ba...gydF4y2Ba“MiniBatchFcn”gydF4y2Ba小批量);gydF4y2Ba

预测测试数据的标签,使用模型函数与训练参数,超参数,和gydF4y2BadoTraininggydF4y2Ba选项设置为false。使用gydF4y2BaonehotdecodegydF4y2Ba函数查找得分最高的预测类,然后将预测与真实标签进行比较。评估平均分类精度。gydF4y2Ba

doTraining=false;预测=[];predCorr=[];gydF4y2Ba虽然gydF4y2Bahasdata(mbqTest) [dlXTest,dlYTest] = next(mbqTest);dlYPred =模型(dlXTest参数、hyperparameters doTraining);dlYPred = softmax (dlYPred,gydF4y2Ba“DataFormat”gydF4y2Ba,gydF4y2Ba“CBT”gydF4y2Ba);YPred = onehotdecode (dlYPred类1);欧美= onehotdecode (dlYTest类1);[预测YPred];predCorr = [predCorr YPred == YTest];gydF4y2Ba结束gydF4y2Ba意思是(predCorr)gydF4y2Ba
ans = 0.9996gydF4y2Ba

使用图将单个序列的预测与相应的测试数据进行比较。gydF4y2Ba

图idx = 1;情节(挤压(预测),gydF4y2Ba“。”gydF4y2Ba)持有gydF4y2Ba在…上gydF4y2Ba绘图(挤压(Y测试))保持gydF4y2Ba从gydF4y2Ba包含(gydF4y2Ba“时间步”gydF4y2Ba)伊拉贝尔(gydF4y2Ba“活动”gydF4y2Ba)标题(gydF4y2Ba“预计活动”gydF4y2Ba)传说([gydF4y2Ba“预测”gydF4y2Ba“测试数据”gydF4y2Ba])gydF4y2Ba

模型函数gydF4y2Ba

功能gydF4y2Ba模型gydF4y2Ba获取输入数据gydF4y2BadlXgydF4y2Ba、可学习模型参数、模型超参数和标志gydF4y2BadoTraininggydF4y2Ba它指定模型应该返回用于训练还是预测的输出。网络在输入序列的每个时间步长输出标签的预测。该模型由多个膨胀系数呈指数增长的残余块体组成。最后残块后,进行最后一次gydF4y2BafullyconnectgydF4y2Ba操作将输出映射到目标数据中的类数量。gydF4y2Ba

作用gydF4y2BadlY = model(dlX,parameters,hyperparameters,doTraining)dropoutFactor = hyperparameters.DropoutFactor;海底= dlX;gydF4y2Ba%残块。gydF4y2Ba为gydF4y2Bak=1:numblock-factor=2^(k-1);参数block=parameters(gydF4y2Ba“块”gydF4y2Ba+k) ;Dy=剩余块(Dy,膨胀因子,衰减因子,参数块,点训练);gydF4y2Ba结束gydF4y2Ba%完全连接gydF4y2Ba重量= parameters.FC.Weights;偏见= parameters.FC.Bias;海底= fullyconnect(海底,重量、偏见,gydF4y2Ba“DataFormat”gydF4y2Ba,gydF4y2Ba“CBT”gydF4y2Ba);gydF4y2Ba结束gydF4y2Ba

剩余块函数gydF4y2Ba

功能gydF4y2BaresidualBlockgydF4y2Ba实现了时间卷积网络的核心构件。gydF4y2Ba

要应用一维因果扩张卷积,请使用gydF4y2BadlconvgydF4y2Ba功能:gydF4y2Ba

  • 若要在空间维度上进行卷积,请设置gydF4y2Ba“DataFormat”gydF4y2Ba选项gydF4y2Ba“哥伦比亚广播公司”gydF4y2Ba(使用尺寸标签gydF4y2Ba“年代”gydF4y2Ba而不是gydF4y2Ba“T”gydF4y2Ba),gydF4y2Ba

  • 设置gydF4y2Ba“DilationFactor”gydF4y2Ba根据剩余块体的膨胀系数选择。gydF4y2Ba

  • 若要确保仅使用过去的时间步长,请仅在序列的开头应用填充。gydF4y2Ba

作用gydF4y2Ba海底= residualBlock (dlX dilationFactor、dropoutFactor parametersBlock, doTraining)gydF4y2Ba%卷积选项。gydF4y2BafilterSize =大小(parametersBlock.Conv1.Weights, 1);paddingSize = (filterSize - 1) *膨胀因子;gydF4y2Ba%卷积。gydF4y2Ba重量= parametersBlock.Conv1.Weights;偏见= parametersBlock.Conv1.Bias;海底= dlconv (dlX、权重、偏见,gydF4y2Ba...gydF4y2Ba“DataFormat”gydF4y2Ba,gydF4y2Ba“哥伦比亚广播公司”gydF4y2Ba,gydF4y2Ba...gydF4y2Ba“步”gydF4y2Ba,1gydF4y2Ba...gydF4y2Ba“DilationFactor”gydF4y2BadilationFactor,gydF4y2Ba...gydF4y2Ba“填充”gydF4y2Ba, (paddingSize;0]);gydF4y2Ba%实例规范化,ReLU,空间退出。gydF4y2BadlY=瞬时标准化(dlY,gydF4y2Ba“哥伦比亚广播公司”gydF4y2Ba);海底= relu(海底);海底= spatialDropout (dropoutFactor海底,gydF4y2Ba“哥伦比亚广播公司”gydF4y2Ba, doTraining);gydF4y2Ba%卷积。gydF4y2Ba重量= parametersBlock.Conv2.Weights;偏见= parametersBlock.Conv2.Bias;海底= dlconv(海底,重量、偏见,gydF4y2Ba...gydF4y2Ba“DataFormat”gydF4y2Ba,gydF4y2Ba“哥伦比亚广播公司”gydF4y2Ba,gydF4y2Ba...gydF4y2Ba“步”gydF4y2Ba,1gydF4y2Ba...gydF4y2Ba“DilationFactor”gydF4y2BadilationFactor,gydF4y2Ba...gydF4y2Ba“填充”gydF4y2Ba,[paddingSize;0]);gydF4y2Ba%实例规范化,ReLU,空间退出。gydF4y2BadlY=瞬时标准化(dlY,gydF4y2Ba“哥伦比亚广播公司”gydF4y2Ba);海底= relu(海底);海底= spatialDropout (dropoutFactor海底,gydF4y2Ba“哥伦比亚广播公司”gydF4y2Ba, doTraining);gydF4y2Ba%可选的1乘1卷积。gydF4y2Ba如果gydF4y2Ba~isequal(大小(dlX),大小(dlY))权重=参数sblock.Conv3.weights;bias=参数sblock.Conv3.bias;dlX=dlconv(dlX,权重,bias,gydF4y2Ba“DataFormat”gydF4y2Ba,gydF4y2Ba“哥伦比亚广播公司”gydF4y2Ba);gydF4y2Ba结束gydF4y2Ba%添加和ReLUgydF4y2Ba海底= relu (dlX +海底);gydF4y2Ba结束gydF4y2Ba

模型梯度函数gydF4y2Ba

的gydF4y2BamodelGradientsgydF4y2Ba函数接受一小批输入数据gydF4y2BadlXgydF4y2Ba,对应的目标序列gydF4y2BaTgydF4y2Ba、可学习参数和超参数,并返回相对于可学习参数和相应损失的梯度。要计算梯度,请计算gydF4y2BamodelGradientsgydF4y2Ba函数使用gydF4y2BadlfevalgydF4y2Ba在训练循环中起作用。gydF4y2Ba

作用gydF4y2Ba[梯度,损失]=模型梯度(dlX,T,参数,超参数,numTimeSteps)dlY=模型(dlX,参数,超参数,true);dlY=softmax(dlY,gydF4y2Ba“DataFormat”gydF4y2Ba,gydF4y2Ba“CBT”gydF4y2Ba);dlT = dlarray (T)gydF4y2Ba“CBT”gydF4y2Ba);loss = maskedCrossEntropyLoss(dlY, dlT, numTimeSteps);梯度= dlgradient(意味着(损失),参数);gydF4y2Ba结束gydF4y2Ba

掩码交叉熵损失函数gydF4y2Ba

的gydF4y2BamaskedCrossEntropyLossgydF4y2Ba函数计算不同长度序列的小批量序列的交叉熵损失。gydF4y2Ba

作用gydF4y2Baloss=maskedCrossEntropyLoss(dlY,dlT,numTimeSteps)numObservations=size(dlY,2);loss=dlarray(零(1,numObservations,gydF4y2Ba“喜欢”gydF4y2Ba海底));gydF4y2Ba为gydF4y2Bai = 1: nummobservations idx = 1:numTimeSteps(i);损失(i) = crossentropy(海底(:,我,idx) dlT(:,我,idx),gydF4y2Ba“DataFormat”gydF4y2Ba,gydF4y2Ba“CBT”gydF4y2Ba);gydF4y2Ba结束gydF4y2Ba结束gydF4y2Ba

归一化函数实例gydF4y2Ba

的gydF4y2BainstanceNormalizationgydF4y2Ba函数将输入标准化gydF4y2BadlXgydF4y2Ba首先计算平均值gydF4y2Ba μgydF4y2Ba 和方差gydF4y2Ba σgydF4y2Ba 2gydF4y2Ba 用于每个输入通道上的每个观测。然后计算标准化激活为gydF4y2Ba

XgydF4y2Ba ˆgydF4y2Ba =gydF4y2Ba XgydF4y2Ba -gydF4y2Ba μgydF4y2Ba σgydF4y2Ba 2gydF4y2Ba +gydF4y2Ba ϵgydF4y2Ba .gydF4y2Ba

与批处理归一化相比,在小批处理中,每个观测的均值和方差是不同的。在卷积层和非线性之间使用归一化,如实例归一化,以加快卷积神经网络的训练和提高收敛性。gydF4y2Ba

作用gydF4y2BadlY = instancnormalize (dlX,fmt) reductiondimms = find(fmt == .gydF4y2Ba“年代”gydF4y2Ba);μ=意味着(dlX reductionDims);sigmaSq = var (dlX 1 reductionDims);ε= 1 e-5;d = (dlX-mu) ./根号(sigmaSq+);gydF4y2Ba结束gydF4y2Ba

函数空间的辍学生gydF4y2Ba

的gydF4y2BaspatialDropoutgydF4y2Ba函数对输入执行空间退出[3]gydF4y2BadlXgydF4y2Ba与尺寸的标签gydF4y2BafmtgydF4y2Ba当gydF4y2BadoTraininggydF4y2Ba国旗是gydF4y2Ba符合事实的gydF4y2Ba.空间丢失丢失了输入数据的整个通道。即以指定的概率丢弃某一信道的所有时间步长gydF4y2BadropoutFactorgydF4y2Ba.通道在批处理维度中被独立删除。gydF4y2Ba

作用gydF4y2Bafmt,海底= spatialDropout (dlX dropoutFactor doTraining)gydF4y2Ba如果gydF4y2BadoTraining maskSize=大小(dlX);maskSize(fmt)==gydF4y2Ba“年代”gydF4y2Ba) = 1;dropoutScaleFactor = single(1 - dropoutFactor);dropoutMask =(兰德(maskSizegydF4y2Ba“喜欢”gydF4y2BadropoutFactor) / dropoutScaleFactor;dlY = dlX .* dropoutMask;gydF4y2Ba其他的gydF4y2Ba海底= dlX;gydF4y2Ba结束gydF4y2Ba结束gydF4y2Ba

权值初始化函数gydF4y2Ba

的gydF4y2Ba初始化高斯语gydF4y2Ba函数从均值为0,标准差为0.01的高斯分布中抽样权重。gydF4y2Ba

作用gydF4y2Ba参数= initializeGaussian(sz)gydF4y2Ba“单一”gydF4y2Ba) * 0.01;gydF4y2Ba结束gydF4y2Ba

Mini-Batch预处理功能gydF4y2Ba

的gydF4y2BapreprocessMiniBatchgydF4y2Ba函数对用于训练的数据进行预处理。的gydF4y2BaNgydF4y2Ba输入序列被转换成gydF4y2BaCgydF4y2Ba——- - - - - -gydF4y2BaNgydF4y2Ba——- - - - - -gydF4y2Ba年代gydF4y2Ba左填充一维序列的数字数组和每个序列中的时间步数,其中gydF4y2BaCgydF4y2Ba对应于序列的特征数和gydF4y2Ba年代gydF4y2Ba对应于最长序列的时间步长。gydF4y2Ba

的gydF4y2BapreprocessMiniBatchgydF4y2Ba函数使用以下步骤对数据进行预处理:gydF4y2Ba

  1. 计算最长序列的长度。gydF4y2Ba

  2. 一次性将每个时间步骤的分类标签编码到数字数组中。gydF4y2Ba

  3. 将序列填充到与迷你批处理中最长序列相同的长度gydF4y2BaleftPadgydF4y2Ba作用gydF4y2Ba

作用gydF4y2Ba[XTransformed,YTransformed,numTimeSteps] = preprocessMiniBatch(XCell,YCell) numTimeSteps = cellfun(@(sequence) size(sequence,2),XCell);sequenceLength = max(cellfun(@(sequence) size(sequence,2),XCell));miniBatchSize =元素个数(伊势亚);numFeatures =大小(伊势亚{1},1);类=类别(YCell {1});numClasses =元素个数(类);szX = [numFeatures miniBatchSize sequenceLength];XTransformed = 0 (szX,gydF4y2Ba“单一”gydF4y2Ba);szY=[numClasses miniBatchSize sequenceLength];YTransformed=零(szY,gydF4y2Ba“单一”gydF4y2Ba);gydF4y2Ba为gydF4y2Bai=1:miniBatchSize预测器=XCell{i};响应=onehotencode(YCell{i},1);gydF4y2Ba%左键盘。gydF4y2BaXTransformed (:,:) = leftPad(预测,sequenceLength);YTransformed (:,:) = leftPad(反应,sequenceLength);gydF4y2Ba结束gydF4y2Ba结束gydF4y2Ba

左填充功能gydF4y2Ba

的gydF4y2BaleftPadgydF4y2Ba函数接受一个序列并将其左填充以获得指定的序列长度。gydF4y2Ba

作用gydF4y2BasequencePadded = leftPad(sequence,sequenceLength) [numFeatures,numTimeSteps] = size(sequence);paddingSize = sequenceLength - numTimeSteps;填充= 0 (numFeatures paddingSize);sequencepadd =[填充序列];gydF4y2Ba结束gydF4y2Ba

梯度削波函数gydF4y2Ba

的gydF4y2BathresholdL2NormgydF4y2Ba函数缩放梯度gydF4y2BaggydF4y2Ba因此,其gydF4y2Ba lgydF4y2Ba 2gydF4y2Ba 规范=gydF4y2BagradientThresholdgydF4y2Ba当gydF4y2Ba lgydF4y2Ba 2gydF4y2Ba 梯度的范数大于gydF4y2BagradientThresholdgydF4y2Ba.gydF4y2Ba

作用gydF4y2Bag=阈值L2norm(g,梯度阈值)梯度norm=sqrt(和(g.^2,gydF4y2Ba“所有”gydF4y2Ba));gydF4y2Ba如果gydF4y2BagradientNorm > gradientThreshold g = g * (gradientThreshold / gradientNorm);gydF4y2Ba结束gydF4y2Ba结束gydF4y2Ba

参考文献gydF4y2Ba

[1] Bai, Shaojie, J. Zico Kolter, Vladlen Koltun。“用于序列建模的一般卷积和递归网络的经验评估。”gydF4y2BaarXiv预印本arXiv: 1803.01271gydF4y2Ba(2018)。gydF4y2Ba

[2] WaveNet:原始音频的生成模型gydF4y2BaSSWgydF4y2Ba125 (2016).gydF4y2Ba

[3] thompson, Jonathan等。“利用卷积网络进行有效的目标定位。”gydF4y2Ba计算机视觉与模式识别会议论文集gydF4y2Ba.2015.gydF4y2Ba

另请参阅gydF4y2Ba

|gydF4y2Ba|gydF4y2Ba|gydF4y2Ba|gydF4y2Ba|gydF4y2Ba|gydF4y2Ba|gydF4y2Ba|gydF4y2Ba|gydF4y2Ba|gydF4y2Ba|gydF4y2Ba

相关话题gydF4y2Ba