このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
1 次元畳み込みを使用した Sequence-to-Sequence 分類のためのコード生成
この例では、時間的畳み込みネットワーク (TCN) の CUDA コードを生成する方法を示します。GPU Coder 構成オブジェクトの代わりに MATLAB Coder 構成オブジェクトを使用して C コードを生成することもできます。この例では、入力時系列の各ステップで予測を行う MEX アプリケーションを生成します。この例では、身体に装着したスマートフォンから得られた加速度計のセンサー データを使用して、装着者のアクティビティについての予測を行います。ユーザーの動きは 5 つのカテゴリのうちの 1 つに分類されます。カテゴリは、ダンス中、ランニング中、着席中、起立中、歩行中です。この例で使用する事前学習済み TCN の詳細については、1 次元畳み込みを使用した sequence-to-sequence 分類 (Deep Learning Toolbox)を参照してください。
サードパーティの前提条件
この例では、CUDA MEX を生成します。以下のサードパーティ要件が適用されます。
CUDA 対応 NVIDIA® GPU および互換性のあるドライバー。
スタティック ライブラリ、ダイナミック ライブラリ、または実行可能ファイルなどの MEX 以外のビルドについて、この例では以下の要件も適用されます。
NVIDIA Toolkit。
コンパイラおよびライブラリの環境変数。詳細については、サードパーティ ハードウェアと前提条件となる製品の設定を参照してください。
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"])
Copyright 2024 The MathWorks, Inc.
参考
関数
オブジェクト
トピック
- 1 次元畳み込みを使用した sequence-to-sequence 分類 (Deep Learning Toolbox)