使用1-D卷积的序列到序列分类
这个例子展示了如何使用通用时态卷积网络(TCN)对序列数据的每个时间步进行分类。
虽然序列到序列的任务通常用循环神经网络架构来解决,但Bai等人[1]表明卷积神经网络可以匹配循环网络在典型序列建模任务上的性能,甚至优于它们。使用卷积网络的潜在好处是更好的并行性,更好地控制接受域大小,更好地控制训练期间网络的内存占用,以及更稳定的梯度。就像循环网络一样,卷积网络可以在可变长度的输入序列上运行,并可用于建模序列对序列或序列对一的任务。
在本例中,训练TCN识别身上佩戴智能手机的人的活动。你使用时间序列数据来训练网络,这些数据代表三个方向的加速度计读数。
负荷训练数据
加载人类活动识别数据。该数据包含从佩戴在身上的智能手机获得的传感器数据的7个时间序列。每个序列有三个特征,长度不同。这三个特征对应于加速度计在三个方向上的读数。
S =负载(“HumanActivityTrain.mat”);XTrain = s.XTrain;TTrain = s.YTrain;
查看训练数据中的观察数。
numObservations = numel(XTrain)
numObservations = 6
查看训练数据中的类数。
类=类别(TTrain{1});numClasses = numel(类)
numClasses = 5
查看训练数据的特征数量。
numFeatures = size(s.XTrain{1},1)
numFeatures = 3
在一个图中想象一个训练序列。画出第一个训练序列和相应活动的特征。
数字为i = 1:3 X = s.XTrain{1}(i,:);subplot(4,1,i) plot(X)“特性”+ I +换行符“加速”)结束次要情节(4,4)在情节(s.YTrain {1})从包含(“时间步”) ylabel (“活动”) subplot(4,1,1)“训练序列一”)
定义深度学习模型
TCN的主要构建块是一个扩展的因果卷积层,它在每个序列的时间步骤上运行。在这种情况下,“因果”意味着为特定时间步计算的激活不能依赖于未来时间步的激活。
为了从之前的时间步骤构建上下文,通常会将多个卷积层堆叠在一起。为了获得更大的接受野尺寸,后续卷积层的膨胀因子呈指数级增长,如下图所示。假设第k个卷积层的膨胀因子为 步幅为1,则该网络的接受场大小可计算为 ,在那里 是滤镜尺寸和 是卷积层数。更改过滤器大小和层数,以便根据手头的数据和任务轻松调整接收字段大小和可学习参数的数量。
与循环网络相比,tcn的缺点之一是它们在推理时占用更大的内存。整个原始序列需要计算下一个时间步长。为了减少推理时间和内存消耗,特别是对于超前预测,可以使用最小的可感知接收野大小进行训练 并且只对最后一个进行预测 输入序列的时间步长。
一般的TCN架构(如[1]所述)由多个残差块组成,每个残差块包含两组具有相同扩张因子的扩张因果卷积层,然后是归一化、ReLU激活和空间dropout层。网络将每个块的输入添加到块的输出中(当输入和输出之间的通道数量不匹配时,包括输入上的1乘1卷积),并应用最终的激活函数。
定义一个网络,其中包含四个这样的剩余块,每个块的膨胀系数都是前一层的两倍,膨胀系数从1开始。对于剩余块,为1-D卷积层指定64个过滤器,过滤器大小为5,对空间dropout层的dropout因子为0.005。对于空间dropout,使用自定义层spatialDropoutLayer
,作为支持文件附在本例中。金宝app要访问此层,请将此示例作为活动脚本打开。
numFilters = 64;filterSize = 5;dropoutFactor = 0.005;numBlocks = 4;层= sequenceInputLayer(numFeatures,归一化=“rescale-symmetric”、名称=“输入”);lgraph = layerGraph(层);outputName = layer.Name;为i = 1:numBlocks dilationFactor = 2^(i-1);layers = [convolution1dLayer(filterSize,numFilters,DilationFactor= DilationFactor,Padding= .“因果”、名称=“conv1_”+i) layerNormalizationLayer spatialDropoutLayer(dropoutFactor) convolution1dLayer(filterSize,numFilters,DilationFactor= DilationFactor,Padding=“因果”) layerNormalizationLayer reluLayer spatialDropoutLayer(dropoutFactor) additionLayer(2,Name=“加”+ i)];添加和连接层。lgraph = addLayers(lgraph,layers);lgraph = connectLayers(lgraph,outputName,“conv1_”+ i);跳过连接。如果I == 1在第一次跳过连接中包含卷积。layer = convolution1dLayer(1,numFilters,Name=“convSkip”);lgraph = addLayers(lgraph,layer);lgraph = connectLayers(lgraph,outputName,“convSkip”);lgraph = connectLayers(“convSkip”,“加”+ I +“/ in2”);其他的lgraph = connectLayers(lgraph,outputName,“加”+ I +“/ in2”);结束更新层输出名称。outputName =“加”+我;结束layers = [fullyConnectedLayer(numClasses,Name= .“俱乐部”) softmaxLayer classificationLayer];lgraph = addLayers(lgraph,layers);lgraph = connectLayers(lgraph,outputName,“俱乐部”);
在图中查看网络。
图表(lgraph)标题(“时域卷积网络”)
指定培训项目
指定一组用于培训的选项。
训练60个epoch,迷你批量大小为1。
以0.001的学习率训练。
以图表形式显示训练进度,并抑制详细输出。
选项= trainingOptions(“亚当”,...MaxEpochs = 60,...miniBatchSize = 1,...情节=“训练进步”,...Verbose = 0);
火车模型
net = trainNetwork(XTrain,TTrain,lgraph,options);
测试模型
通过比较保留测试集上的预测与每个时间步骤的真实标签来测试模型的分类准确性。
加载测试数据。
S =负载(“HumanActivityTest.mat”);XTest = s.XTest;TTest = s.YTest;
使用训练过的网络进行预测分类
函数。
YPred = category (net,XTest);
将预测结果与相应的测试数据在图中进行比较。
图绘制(YPred {1},“。”)举行在情节(tt {1})从包含(“时间步”) ylabel (“活动”)传说([“预测”“测试数据”),位置=“东北”)标题(“测试序列预测”)
在一个混淆矩阵中可视化预测。
YPred图confusionchart (tt {1}, {1})
通过将预测结果与测试标签进行比较来评估分类精度。
accuracy = mean(YPred{1} == TTest{1})
准确度= 0.9919
参考文献
[1] Bai, Shaojie, J. Zico Kolter和Vladlen Koltun。用于序列建模的通用卷积和循环网络的经验评价预印本,2018年4月19日提交。https://arxiv.org/abs/1803.01271。
Oord, Aaron van den, Sander Dieleman, Heiga Zen, Karen Simonyan, Oriol Vinyals, Alex Graves, Nal Kalchbrenner, Andrew Senior和Koray Kavukcuoglu。WaveNet:原始音频的生成模型预印本,2016年9月12日提交。https://arxiv.org/abs/1609.03499。
汤普森、乔纳森、罗斯·戈罗辛、阿琼·杰恩、扬·勒昆和克里斯托弗·布雷格勒。“使用卷积网络进行有效的对象定位。2015年IEEE计算机视觉与模式识别会议(CVPR), 648-56。https://doi.org/10.1109/CVPR.2015.7298664。
另请参阅
convolution1dLayer
|trainingOptions
|trainNetwork
|sequenceInputLayer
|maxPooling1dLayer
|averagePooling1dLayer
|globalMaxPooling1dLayer
|globalAveragePooling1dLayer