Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

1 次元畳み込みを使用したシーケンス分類

この例では、1 次元畳み込みニューラル ネットワークを使用してシーケンス データを分類する方法を説明します。

シーケンス データを分類するよう深層ニューラル ネットワークに学習させるために、1 次元畳み込みニューラル ネットワークを使用できます。1 次元畳み込み層は、1 次元入力にスライディング畳み込みフィルターを適用することにより、特徴を学習します。1 次元畳み込み層を使用すると、畳み込み層が 1 回の操作で入力を処理できるため、再帰層を使用するよりも高速になります。一方、再帰層では入力のタイム ステップを反復処理しなければなりません。ただし、ネットワーク アーキテクチャやフィルター サイズによっては、1 次元畳み込み層が、タイム ステップ間の長期的な依存関係を学習できる再帰層ほどには機能しない可能性があります。

この例では、[1] および [2] に記載のある Japanese Vowels データ セットを使用します。この例では、続けて発音された 2 つの日本語の母音を表す時系列データにおいて、その話者を認識するように、1 次元畳み込みニューラル ネットワークに学習させます。学習データには、9 人の話者の時系列データが含まれています。各シーケンスには 12 個の特徴があり、長さはさまざまです。データセットには 270 個の学習観測値と 370 個のテスト観測値が含まれています。

シーケンス データの読み込み

サンプル データを WaveformData.mat から読み込みます。データは、numObservations 行 1 列のシーケンスの cell 配列です。ここで、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);

1 次元畳み込みネットワーク アーキテクチャの定義

1 次元畳み込みニューラル ネットワーク アーキテクチャを定義します。

  • 入力サイズを入力データの特徴の数として指定する。

  • 畳み込み層のフィルター サイズが 5 である 1 次元畳み込み層、ReLU 層、およびレイヤー正規化層から成るブロックを 2 つ指定する。32 個のフィルターと 64 個のフィルターを最初と 2 番目の畳み込み層にそれぞれ指定する。どちらの畳み込み層に対しても、出力の長さが同じになるように入力を左パディングする (因果的パディング)。

  • 畳み込み層の出力を単一のベクトルに減らすために、1 次元グローバル平均プーリング層を使用する。

  • 出力を確率のベクトルにマッピングするために、出力サイズとクラスの数が一致する全結合層を指定し、その後にソフトマックス層と分類層を配置する。

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)

参考

| | | | | | |

関連するトピック