Main Content

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

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

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

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

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

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

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

  • 入力サイズを入力データのチャネルの数として指定します。

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

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

  • 最後に、クラス数と一致する出力サイズをもつ全結合層を含め、その後にソフトマックス層を含める。

ディープ ネットワーク デザイナーアプリを使用してこのネットワークを構築することもできます。ディープ ネットワーク デザイナーのスタート ページの [Sequence-to-Label 分類ネットワーク (未学習)] セクションで、[1-D 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];

学習オプションの指定

学習オプションを指定します。オプションの中から選択するには、経験的解析が必要です。実験を実行してさまざまな学習オプションの構成を調べるには、実験マネージャーアプリを使用できます。

  • 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)

参考

| | | | | | | |

関連するトピック