使用一维卷积进行序列分类
此示例说明如何使用一维卷积神经网络对序列数据进行分类。
为了训练深度神经网络来对序列数据进行分类,可以使用一维卷积神经网络。一维卷积层通过对一维输入应用滑动卷积滤波器来学习特征。使用一维卷积层可能比使用循环层更快,因为卷积层可以通过单一运算来处理输入。相反,循环层必须对输入的时间步进行迭代。然而,根据网络架构和滤波器大小,一维卷积层的性能可能不如循环层,循环层可以学习各时间步之间的长期相关性。
加载序列数据
从 WaveformData.mat
加载示例数据。数据是序列的 numObservations
×1 元胞数组,其中 numObservations
是序列数。每个序列都是一个 numTimeSteps
×numChannels
数值数组,其中 numTimeSteps
是序列的时间步数,numChannels
是序列的通道数。
load WaveformData
在绘图中可视化一些序列。
numChannels = size(data{1},2); idx = [3 4 5 12]; figure tiledlayout(2,2) for i = 1:4 nexttile stackedplot(data{idx(i)},DisplayLabels="Channel "+string(1:numChannels)) xlabel("Time Step") title("Class: " + string(labels(idx(i)))) end
留出用于验证和测试的数据。将数据划分为训练集(包含 80% 的数据)、验证集(包含 10% 的数据)和测试集(包含其余 10% 的数据)。要划分数据,请使用 trainingPartitions
函数,此函数作为支持文件包含在此示例中。要访问此文件,请以实时脚本形式打开此示例。
numObservations = numel(data); [idxTrain,idxValidation,idxTest] = trainingPartitions(numObservations, [0.8 0.1 0.1]); XTrain = data(idxTrain); TTrain = labels(idxTrain); XValidation = data(idxValidation); TValidation = labels(idxValidation); XTest = data(idxTest); TTest = labels(idxTest);
定义一维卷积网络架构
定义一维卷积神经网络架构。
将输入大小指定为输入数据的通道数量。
指定两个由一维卷积层、ReLU 和层归一化层组成的模块,其中卷积层的滤波器大小为 5。分别为第一个和第二个卷积层指定 32 个和 64 个滤波器。对于两个卷积层,都对输入进行左填充,以使输出的长度相同(因果填充)。
要将卷积层的输出减少到单个向量,请使用一维全局平均池化层。
要将输出映射到概率向量,请指定一个输出大小与类数匹配的全连接层,后跟一个 softmax 层。
您也可以使用深度网络设计器构建该网络。在深度网络设计器起始页,在序列到标签分类网络(未训练) 部分中点击一维 CNN。
filterSize = 5; numFilters = 32; classNames = categories(TTrain); numClasses = numel(classNames); layers = [ ... sequenceInputLayer(numChannels) convolution1dLayer(filterSize,numFilters,Padding="causal") reluLayer layerNormalizationLayer convolution1dLayer(filterSize,2*numFilters,Padding="causal") reluLayer layerNormalizationLayer globalAveragePooling1dLayer fullyConnectedLayer(numClasses) softmaxLayer];
指定训练选项
指定训练选项。在选项中进行选择需要经验分析。要通过运行试验探索不同训练选项配置,您可以使用Experiment Manager。
使用 Adam 优化器以 0.01 的学习率进行 60 轮训练。
对序列进行左填充。
使用验证数据验证网络。
在图中监控训练进度并隐藏详尽输出。
options = trainingOptions("adam", ... MaxEpochs=60, ... InitialLearnRate=0.01, ... SequencePaddingDirection="left", ... ValidationData={XValidation,TValidation}, ... Plots="training-progress", ... Metrics="accuracy", ... Verbose=false);
训练神经网络
使用 trainnet
函数训练神经网络。对于分类,使用交叉熵损失。默认情况下,trainnet
函数使用 GPU(如果有)。在 GPU 上进行训练需要 Parallel Computing Toolbox™ 许可证和受支持的 GPU 设备。有关受支持设备的信息,请参阅GPU 计算要求 (Parallel Computing Toolbox)。否则,trainnet
函数使用 CPU。要指定执行环境,请使用 ExecutionEnvironment
训练选项。
net = trainnet(XTrain,TTrain,layers,"crossentropy",options);
测试神经网络
使用 testnet
函数测试神经网络,并使用训练所使用的相同参量。对于单标签分类,需评估准确度。准确度是指正确预测的百分比。默认情况下,testnet
函数使用 GPU(如果有)。要手动选择执行环境,请使用 testnet
函数的 ExecutionEnvironment
参量。
accuracy = testnet(net,XTest,TTest,"accuracy",SequencePaddingDirection="left")
accuracy = 72
在混淆矩阵中可视化预测。使用 minibatchpredict
函数进行预测,并使用与训练相同的序列填充选项。要使用多个观测值进行预测,请使用 minibatchpredict
函数。要将预测分数转换为标签,请使用 scores2label
函数。minibatchpredict
函数自动使用 GPU(如果有)。要手动选择执行环境,请使用 minibatchpredict
函数的 ExecutionEnvironment
参量。
scores = minibatchpredict(net,XTest,SequencePaddingDirection="left");
YTest = scores2label(scores, classNames);
figure
confusionchart(TTest,YTest)
另请参阅
convolution1dLayer
| trainnet
| trainingOptions
| dlnetwork
| sequenceInputLayer
| maxPooling1dLayer
| averagePooling1dLayer
| globalMaxPooling1dLayer
| globalAveragePooling1dLayer