1 次元畳み込みを使用したシーケンス分類
この例では、1 次元畳み込みニューラル ネットワークを使用してシーケンス データを分類する方法を説明します。
シーケンス データを分類するよう深層ニューラル ネットワークに学習させるために、1 次元畳み込みニューラル ネットワークを使用できます。1 次元畳み込み層は、1 次元入力にスライディング畳み込みフィルターを適用することにより、特徴を学習します。1 次元畳み込み層を使用すると、畳み込み層が 1 回の操作で入力を処理できるため、再帰層を使用するよりも高速になります。一方、再帰層では入力のタイム ステップを反復処理しなければなりません。ただし、ネットワーク アーキテクチャやフィルター サイズによっては、1 次元畳み込み層が、タイム ステップ間の長期的な依存関係を学習できる再帰層ほどには機能しない可能性があります。
シーケンス データの読み込み
サンプル データを WaveformData.mat
から読み込みます。データは、numObservations
行 1 列のシーケンスの cell 配列です。ここで、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);
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)
参考
convolution1dLayer
| trainnet
| trainingOptions
| dlnetwork
| sequenceInputLayer
| maxPooling1dLayer
| averagePooling1dLayer
| globalMaxPooling1dLayer
| globalAveragePooling1dLayer
関連するトピック
- 1 次元畳み込みを使用した sequence-to-sequence 分類
- 深層学習を使用したシーケンスの分類
- Train Sequence Classification Network Using Data with Imbalanced Classes
- 深層学習を使用した sequence-to-sequence 分類
- 深層学習を使用した sequence-to-sequence 回帰
- 深層学習を使用した sequence-to-one 回帰
- 深層学習を使用した時系列予測
- Interpret Deep Learning Time-Series Classifications Using Grad-CAM
- 長短期記憶ニューラル ネットワーク
- 深層学習層の一覧