メインコンテンツ

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

1 次元畳み込みを使用した Sequence-to-Sequence 分類のためのコード生成

R2024a 以降

この例では、時間的畳み込みネットワーク (TCN) の CUDA コードを生成する方法を示します。GPU Coder 構成オブジェクトの代わりに MATLAB Coder 構成オブジェクトを使用して C コードを生成することもできます。この例では、入力時系列の各ステップで予測を行う MEX アプリケーションを生成します。この例では、身体に装着したスマートフォンから得られた加速度計のセンサー データを使用して、装着者のアクティビティについての予測を行います。ユーザーの動きは 5 つのカテゴリのうちの 1 つに分類されます。カテゴリは、ダンス中、ランニング中、着席中、起立中、歩行中です。この例で使用する事前学習済み TCN の詳細については、1 次元畳み込みを使用した sequence-to-sequence 分類 (Deep Learning Toolbox)を参照してください。

サードパーティの前提条件

この例では、CUDA MEX を生成します。以下のサードパーティ要件が適用されます。

  • CUDA 対応 NVIDIA® GPU および互換性のあるドライバー。

スタティック ライブラリ、ダイナミック ライブラリ、または実行可能ファイルなどの MEX 以外のビルドについて、この例では以下の要件も適用されます。

GPU 環境の検証

関数coder.checkGpuInstallを使用して、この例を実行するのに必要なコンパイラおよびライブラリが正しく設定されていることを検証します。

envCfg = coder.gpuEnvConfig('host');
envCfg.Quiet = 1;
coder.checkGpuInstall(envCfg);

human_activity_predict エントリポイント関数

sequence-to-sequence 1 次元 CNN ネットワークを使用すると、データ シーケンスの個々のタイム ステップごとに異なる予測を行うことができます。human_activity_predict.m エントリポイント関数は、入力シーケンスを受け取り、予測用の学習済み TCN に渡します。このエントリポイント関数は、dlnetwork オブジェクトを HumanActivityNet.mat ファイルから永続変数に読み込み、以降の予測呼び出しではその永続オブジェクトを再利用します。dlarray オブジェクトはエントリポイント関数内で作成されます。関数の入力と出力は数値データ型です。詳細については、dlarray 用のコード生成を参照してください。

type('human_activity_predict.m')
function out = human_activity_predict(net, in) %#codegen
% Copyright 2024 The MathWorks, Inc.

% The input contains two dimensions corresponding to channel and time. 
% Therefore, the dataformat passed to dlarray constructor is specified as 'CT'.
dlIn = dlarray(in,'CT');
persistent dlnet;

if isempty(dlnet)
    dlnet = coder.loadDeepLearningNetwork(net);
end

dlOut = predict(dlnet,dlIn);

out = extractdata(dlOut);
end

TCN の主な基本構成は、膨張因果的畳み込み層です。この層は各シーケンスのタイム ステップ全体にわたり演算を行います。ネットワークの詳細については、1 次元畳み込みを使用した sequence-to-sequence 分類 (Deep Learning Toolbox)を参照してください。

netStruct = load('HumanActivityNet.mat');
disp(netStruct.net.Layers);
  36×1 Layer array with layers:

     1   'input'           Sequence Input        Sequence input with 3 dimensions
     2   'conv1_1'         1-D Convolution       64 5×3 convolutions with stride 1 and padding 'causal'
     3   'layernorm_1'     Layer Normalization   Layer normalization with 64 channels
     4   'SpatialDrop01'   Spatial Dropout       Spatial Dropout
     5   'conv1d'          1-D Convolution       64 5×64 convolutions with stride 1 and padding 'causal'
     6   'layernorm_2'     Layer Normalization   Layer normalization with 64 channels
     7   'relu'            ReLU                  ReLU
     8   'SpatialDrop02'   Spatial Dropout       Spatial Dropout
     9   'add_1'           Addition              Element-wise addition of 2 inputs
    10   'convSkip'        1-D Convolution       64 1×3 convolutions with stride 1 and padding [0  0]
    11   'conv1_2'         1-D Convolution       64 5×64 convolutions with stride 1, dilation factor 2, and padding 'causal'
    12   'layernorm_3'     Layer Normalization   Layer normalization with 64 channels
    13   'SpatialDrop21'   Spatial Dropout       Spatial Dropout
    14   'conv1d_1'        1-D Convolution       64 5×64 convolutions with stride 1, dilation factor 2, and padding 'causal'
    15   'layernorm_4'     Layer Normalization   Layer normalization with 64 channels
    16   'relu_1'          ReLU                  ReLU
    17   'SpatialDrop22'   Spatial Dropout       Spatial Dropout
    18   'add_2'           Addition              Element-wise addition of 2 inputs
    19   'conv1_3'         1-D Convolution       64 5×64 convolutions with stride 1, dilation factor 4, and padding 'causal'
    20   'layernorm_5'     Layer Normalization   Layer normalization with 64 channels
    21   'SpatialDrop41'   Spatial Dropout       Spatial Dropout
    22   'conv1d_2'        1-D Convolution       64 5×64 convolutions with stride 1, dilation factor 4, and padding 'causal'
    23   'layernorm_6'     Layer Normalization   Layer normalization with 64 channels
    24   'relu_2'          ReLU                  ReLU
    25   'SpatialDrop42'   Spatial Dropout       Spatial Dropout
    26   'add_3'           Addition              Element-wise addition of 2 inputs
    27   'conv1_4'         1-D Convolution       64 5×64 convolutions with stride 1, dilation factor 8, and padding 'causal'
    28   'layernorm_7'     Layer Normalization   Layer normalization with 64 channels
    29   'SpatialDrop61'   Spatial Dropout       Spatial Dropout
    30   'conv1d_3'        1-D Convolution       64 5×64 convolutions with stride 1, dilation factor 8, and padding 'causal'
    31   'layernorm_8'     Layer Normalization   Layer normalization with 64 channels
    32   'relu_3'          ReLU                  ReLU
    33   'SpatialDrop62'   Spatial Dropout       Spatial Dropout
    34   'add_4'           Addition              Element-wise addition of 2 inputs
    35   'fc'              Fully Connected       5 fully connected layer
    36   'softmax'         Softmax               softmax

analyzeNetwork (Deep Learning Toolbox)関数を使用し、ネットワーク アーキテクチャとネットワーク層に関する情報を対話的に可視化して表示することもできます。

CUDA MEX の生成

human_activity_predict.m エントリポイント関数用の CUDA MEX を生成するには、GPU の構成オブジェクトを作成し、ターゲットを MEX にするよう指定します。ターゲット ライブラリを none として指定する深層学習構成オブジェクトを作成します。この深層学習構成オブジェクトを GPU 構成オブジェクトに追加します。TCN ネットワークは、TargetLibrary'none' に設定されている場合にコード生成に対してのみサポートされる 1 次元畳み込み層をもちます。

cfg = coder.gpuConfig('mex');
cfg.DeepLearningConfig = coder.DeepLearningConfig(TargetLibrary='none');

コンパイル時に、GPU Coder™ はエントリポイント関数のすべての入力についてデータ型を把握していなければなりません。コード生成用のネットワークへの入力を指定します。

s = load("HumanActivityData.mat");
XTest = s.XTest;
YTest = s.YTest;

codegen コマンドを実行します。

codegen -config cfg human_activity_predict -args {coder.Constant('HumanActivityNet.mat'), single(XTest{1})} -report
Code generation successful: View report

生成された MEX のテスト データについての実行

HumanActivityValidate MAT ファイルには、生成コードをテストできるセンサーの読み取り値のサンプル時系列を含む変数 XTest が格納されます。MAT ファイルを読み込み、展開のためにデータを single にキャストします。最初の観測値について human_activity_predict_mex 関数を呼び出します。

YPred = human_activity_predict_mex('HumanActivityNet.mat',single(XTest{1}));

YPred は、53888 のタイム ステップのそれぞれについての 5 つのクラスの確率を格納する 5 行 53888 列の数値行列です。各タイム ステップについて、最大確率のインデックスを計算して、予測されたクラスを見つけます。

[~, maxIndex] = max(YPred, [], 1);

最大確率のインデックスを対応するラベルに関連付けます。最初の 10 個のラベルを表示します。その結果から、ネットワークはその人が最初の 10 のタイム ステップの間、座っていると予測したことがわかります。

labels = categorical({'Dancing', 'Running', 'Sitting', 'Standing', 'Walking'});
predictedLabels1 = labels(maxIndex);
disp(predictedLabels1(1:10)')
     Sitting 
     Sitting 
     Sitting 
     Sitting 
     Sitting 
     Sitting 
     Sitting 
     Sitting 
     Sitting 
     Sitting 

予測とテスト データとの比較

プロットを使用して、MEX 出力をテスト データと比較します。

figure
plot(predictedLabels1,'.-');
hold on
plot(YTest{1});
hold off

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

Figure contains an axes object. The axes object with title Predicted Activities, xlabel Time Step, ylabel Activity contains 2 objects of type line. These objects represent Predicted, Test Data.

Copyright 2024 The MathWorks, Inc.

参考

関数

オブジェクト

トピック