Main Content

使用一维卷积进行序列分类

此示例说明如何使用一维卷积神经网络对序列数据进行分类。

为了训练深度神经网络来对序列数据进行分类,可以使用一维卷积神经网络。一维卷积层通过对一维输入应用滑动卷积滤波器来学习特征。使用一维卷积层可能比使用循环层更快,因为卷积层可以通过单一运算来处理输入。相反,循环层必须对输入的时间步进行迭代。然而,根据网络架构和滤波器大小,一维卷积层的性能可能不如循环层,循环层可以学习各时间步之间的长期相关性。

此示例使用 [1] 和 [2] 中所述的日语元音数据集。此示例训练一个一维卷积神经网络,旨在根据表示连续说出的两个日语元音的时间序列数据来识别说话者。训练数据包含九个说话者的时间序列数据。每个序列有 12 个特征,且长度不同。该数据集包含 270 个训练观测值和 370 个测试观测值。

加载序列数据

WaveformData.mat 加载示例数据。数据是序列的 numObservations×1 元胞数组,其中 numObservations 是序列数。每个序列都是一个 numChannels×-numTimeSteps 数值数组,其中 numChannels 是序列的通道数,numTimeSteps 是序列的时间步数并用波形的类型进行标注。

load WaveformData

在绘图中可视化一些序列。

numChannels = size(data{1},1);

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 层和一个分类层。

filterSize = 5;
numFilters = 32;

numFeatures = size(XTrain{1},1);
numClasses = numel(categories(TTrain));

layers = [ ...
    sequenceInputLayer(numFeatures)
    convolution1dLayer(filterSize,numFilters,Padding="causal")
    reluLayer
    layerNormalizationLayer
    convolution1dLayer(filterSize,2*numFilters,Padding="causal")
    reluLayer
    layerNormalizationLayer
    globalAveragePooling1dLayer
    fullyConnectedLayer(numClasses)
    softmaxLayer
    classificationLayer];

指定训练选项

指定训练选项:

  • 使用 Adam 优化器以 0.01 的学习率进行 60 轮训练。

  • 对序列进行左填充。

  • 使用验证数据验证网络。

  • 在图中监控训练进度并隐藏详尽输出。

miniBatchSize = 27;

options = trainingOptions("adam", ...
    MaxEpochs=60, ...
    InitialLearnRate=0.01, ...
    SequencePaddingDirection="left", ...
    ValidationData={XValidation,TValidation}, ...
    Plots="training-progress", ...
    Verbose=0);

训练网络

使用 trainNetwork 函数以指定的训练选项训练网络。

net = trainNetwork(XTrain,TTrain,layers,options);

测试网络

使用用于训练的相同序列填充选项对测试数据进行分类。

YTest = classify(net,XTest, ...
    SequencePaddingDirection="left");

计算预测值的分类准确度。

acc = mean(YTest == TTest)
acc = 0.8400

在混淆矩阵中可视化预测。

figure
confusionchart(TTest,YTest)

另请参阅

| | | | | | |

相关主题