ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

深層学習を使用した sequence-to-sequence 分類

この例では、長短期記憶 (LSTM) ネットワークを使用してシーケンス データの各タイム ステップを分類する方法を説明します。

シーケンス データの各タイム ステップを分類するよう深層ニューラル ネットワークに学習させるために、"sequence-to-sequence LSTM ネットワーク" を使用できます。sequence-to-sequence LSTM ネットワークでは、シーケンス データの個々のタイム ステップで異なる予測を行うことができます。

この例では、体に装着したスマートフォンから得られたセンサー データを使用します。この例では、3 つの異なる方向での加速度計の測定値を表す時系列データを与えて、装着者の行動を認識するように、LSTM ネットワークに学習させます。学習データには、7 人分の時系列データが含まれています。各シーケンスには 3 つの特徴があり、長さはさまざまです。データセットには 6 つの学習観測値と 1 つのテスト観測値が含まれています。

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

行動認識データを読み込みます。このデータには、体に装着したスマートフォンから得られたセンサー データの 7 つの時系列が含まれています。各シーケンスには 3 つの特徴があり、長さはさまざまです。3 つの特徴は、3 つの異なる方向での加速度計の測定値に対応します。

load HumanActivityTrain
XTrain
XTrain = 1×6 cell array
    {3×64480 double}    {3×53696 double}    {3×56416 double}    {3×50688 double}    {3×51888 double}    {3×54256 double}

1 つの学習シーケンスをプロットで可視化します。最初の学習シーケンスの最初の特徴をプロットし、対応する行動に応じてプロットに色を付けます。

X = XTrain{1}(1,:);
classes = categories(YTrain{1});

figure
for j = 1:numel(classes)
    label = classes(j);
    idx = find(YTrain{1} == label);
    hold on
    plot(idx,X(idx))
end
hold off

xlabel("Time Step")
ylabel("Acceleration")
title("Training Sequence 1, Feature 1")
legend(classes,'Location','northwest')

LSTM ネットワーク アーキテクチャの定義

LSTM ネットワーク アーキテクチャを定義します。入力をサイズ 3 (入力データの特徴次元) のシーケンスになるように指定します。100 個の隠れユニットを持つ LSTM 層を指定して、シーケンス全体を出力します。最後に、サイズが 5 の全結合層を含めることによって 5 個のクラスを指定し、その後にソフトマックス層と分類層を配置します。

featureDimension = 3;
numHiddenUnits = 100;
numClasses = 5;

layers = [ ...
    sequenceInputLayer(featureDimension)
    lstmLayer(numHiddenUnits,'OutputMode','sequence')
    fullyConnectedLayer(numClasses)
    softmaxLayer
    classificationLayer];

学習オプションを指定します。ソルバーを 'adam' に設定します。初期学習率を 0.01 に指定し、20 エポック後に既定の係数 (0.1) で学習率を下げます。勾配の発散を防ぐために、勾配のしきい値を 1 に設定します。

options = trainingOptions('adam', ...
    'GradientThreshold',1, ...
    'InitialLearnRate',0.01, ...
    'LearnRateSchedule','piecewise', ...
    'LearnRateDropPeriod',20, ...
    'Verbose',0, ...
    'Plots','training-progress');

trainNetwork を使用し、指定した学習オプションで LSTM ネットワークに学習させます。各ミニバッチには学習セット全体が含まれているので、プロットはエポックごとに更新されます。シーケンスが非常に長いため、各ミニバッチの処理とプロットの更新に時間がかかる場合があります。

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

LSTM ネットワークのテスト

テスト データを読み込み、タイム ステップごとに行動を分類します。

行動のテスト データを読み込みます。XTest は 3 次元の単一シーケンスです。YTest は、各タイム ステップでの行動に対応する categorical ラベルのシーケンスです。

load HumanActivityTest
figure
plot(XTest')
xlabel("Time Step")
legend("Feature " + (1:featureDimension))
title("Test Data")

classify を使用してテスト データを分類します。

YPred = classify(net,XTest);

または、classifyAndUpdateState を使用して 1 タイム ステップずつ予測できます。これは、タイム ステップの値がストリームで到着する場合に役立ちます。通常、1 タイム ステップずつ予測するよりも、シーケンス全体について予測する方が高速です。1 つのタイム ステップでの予測間にネットワークを更新して将来のタイム ステップを予測する方法を示す例については、深層学習を使用した時系列予測を参照してください。

予測の精度を計算します。

acc = sum(YPred == YTest)./numel(YTest)
acc = 0.9958

プロットを使用して予測をテスト データと比較します。

figure
plot(YPred,'.-')
hold on
plot(YTest)
hold off

xlabel("Time Step")
ylabel("Activity")
title("Predicted Activities")
legend(["Predicted" "Test Data"])

参考

| | |

関連するトピック