このページの翻訳は最新ではありません。ここをクリックして,英语の最新版を参照してください。
この例では、長短期記憶 (LSTM)ネットワーク用の CUDA®コードを生成する方法を説明します。この例では、入力 时间序列の各ステップでの予測を行う 墨西哥アプリケーションを生成します。次の 2.つの方法について説明します。1.つは標準の LSTMネットワークを使用する方法、もう 1.つは同じ LSTMネットワークのステートフルな動作を利用する方法です。この例では、身体に装着したスマートフォンから得られた加速度計のセンサー データを使用して、装着者のアクティビティについての予測を行います。ユーザーの動きは 5.つのカテゴリのうちの 1.つに分類されます。カテゴリは、ダンス中、ランニング中、着席中、起立中、歩行中です。この例では事前学習済みの LSTMネットワークを使用します。学習の詳細については、深度学习工具箱™ からの深层学习を使用したシーケンスの分类(深学习工具箱)の例を参照してください。
必须
この例では,CUDA MEXを生成します。以下のサードパーティ要件が适用されます。
CUDA対応NVIDIA®GPUおよび互换性のあるドライバー。
オプション
スタティック ライブラリ、ダイナミック ライブラリ、または実行可能ファイルなどの 墨西哥以外のビルドについて、この例では以下の要件も適用されます。
NVIDIAツールキット。
NVIDIA cuDNNライブラリ。
コンパイラおよびライブラリの环境変数。详细は,サードパーティハードウェアと前提条件となる制品の设定を参照してください。
关节coder.checkGpuInstall
を使用して,この例を実行するのに必要なコンパイラおよびライブラリが正しく设定されていることを検证します。
envCfg=coder.gpuEnvConfig(“主持人”);envCfg.DeepLibTarget =“cudnn”;envCfg.DeepCodegen=1;envCfg.Quiet=1;coder.checkGpuInstall(envCfg);
lstmnet_predict
序列间LSTMネットワークでは、データ シーケンスの個々のタイム ステップで異なる予測を行うことができます。エントリポイント関数lstmnet_predict.mは,入力シーケンスを受け取り,予测のために学习済みLSTMネットワークに渡します。特に,この关数は“深层学习を使用した顺序对顺序分類" の例で学習させた LSTMネットワークを使用します。この関数は、ネットワーク オブジェクトをlstmnet_predict.mat
ファイルから永続変数に読み込み,以降の予测呼び出しではその永続オブジェクトを再利用します。
ネットワークアーキテクチャの対话的な可视化とネットワーク层についての详细情报を表示するには,关数analyzeNetwork
(深学习工具箱)を使用します。
类型('lstmnet_predict.m')
功能OUT = lstmnet_predict(上)%#代码生成%版权所有2019 MathWorks公司持久我的网;如果的isEmpty(我的网)我的网= coder.loadDeepLearningNetwork( 'lstmnet.mat');结束%通过在输入了预测=(我的网,在);
エントリポイント関数lstmnet_predict.m
用のCUDA MEXを生成するには,GPUの构成オブジェクトを作成し,ターゲットをMEXにするよう指定します。ターゲット言语をC ++に设定します。ターゲットライブラリをcuDNNとして指定する深层学习の构成オブジェクトを作成します。この深层学习构成オブジェクトをGPU构成オブジェクトに追加します。
CFG = coder.gpuConfig('MEX');cfg.TargetLang ='C ++';cfg.DeepLearningConfig = coder.DeepLearningConfig(“cudnn”);
コンパイル时に,GPU编码器™はエントリポイント关数のすべての入力についてデータ型を把握していなければなりません。关数编码员
を使用して、入力引数の型とサイズを代码生成
コマンドに指定します。この例では,入力は特徴次元値3と可変のシーケンス长をもつ双のデータ型です。シーケンス长を可変サイズとして指定することで,任意の长さの入力シーケンスについての予测を実行できるようになります。
matrixInput = coder.typeof(双(0),[3 Inf文件],[假真]);
代码生成コマンドを実行します。
代码生成-configCFGlstmnet_predict-args{} matrixInput-报告
代码生成成功:要查看报告,打开( '代码生成/ MEX / lstmnet_predict / HTML / report.mldatx')。
HumanActivityValidate
垫子ファイルを読み込みます。この 垫子ファイルには、生成コードをテストできるセンサーの読み取り値のサンプル 时间序列を含む変数XValidate
が格納されます。最初の観測値について预测
を呼び出します。
加载HumanActivityValidateYPred1 = lstmnet_predict_mex(XValidate {1});
YPred1
は,53888のタイムステップのそれぞれについての5つのクラスの确率を含む5行53888列の数値行列です。各タイムステップについて,最大确率のインデックスを计算して,予测されたクラスを见つけます。
[〜,maxIndex] = MAX(YPred1,[],1);
最大确率のインデックスを対応するラベルに关连付けます。最初の10个のラベルを表示します。その结果から,ネットワークはその人が最初の10のタイムステップの间,座っていると予测したことがわかります。
标签=分类({“跳舞”那'跑步'那“坐着”那'常设'那'步行'});predictedLabels1 =标签(maxIndex);DISP(predictedLabels1(1:10))
第1列至第6列坐式第7列至第10列坐式
プロットを使用してMEXの出力データをテストデータと比较します。
图图(predictedLabels1,'.-'); 持有在…上绘图(YValidate{1});保留关xlabel(“时间步长”)伊拉贝尔(“活动”)头衔(“预计活动”)传奇([“预测”“测试数据”])
異なるシーケンス長をもつ 2.番目の観測値について预测
を呼び出します。この例では,XValidate {2}
はシーケンス长が64480である一方,XValidate {1}
はシーケンス长が53888でした。シーケンス长の次元を可変サイズに指定したため,生成コードは予测を正しく处理します。
YPred2=lstmnet\u predict\u mex(XValidate{2});[~,maxIndex]=max(YPred2,[],1);predictedLabels2=labels(maxIndex);disp(predictedLabels2(1:10))
第1列至第6列坐式第7列至第10列坐式
多数の観測値について一度に予測を行う場合は、観測値をまとめて 细胞配列にグループ化し、予測のためその 细胞配列を渡すことができます。この 细胞配列は列セル配列でなければならず、各 细胞には 1.つの観測値が含まれていなければなりません。それぞれの観測値は同じ特徴次元をもたなければなりませんが、シーケンス長は変動してもかまいません。この例では、XValidate
には5つの観测値が含まれています。XValidate
を入力として受け入れる 墨西哥を生成するには、入力の型を 5.行 1.列の 细胞配列になるよう指定します。さらに、各 细胞はmatrixInput
と同じ型として指定します。これは,前の代码生成
コマンドで単一の観测値について指定した型です。
matrixInput = coder.typeof(双(0),[3 Inf文件],[假真]);cellInput = coder.typeof({matrixInput},[5 1]);代码生成-configCFGlstmnet_predict-args{} cellInput-报告YPred3 = lstmnet_predict_mex(XValidate);
代码生成成功:要查看报告,打开( '代码生成/ MEX / lstmnet_predict / HTML / report.mldatx')。
出力は,渡された5つの観测値に対する予测の5行1列の细胞配列です。
DISP(YPred3)
{5×53888 single}{5×64480 single}{5×53696 single}{5×56416 single}{5×50688 single}
時系列全体を渡して 1.ステップで予測する代わりに、関数predictAndUpdateState
(深学习工具箱)を使用して 1.タイム ステップで一度にストリーミングすることにより、入力についての予測を実行できます。この関数は、入力を受け取り、出力予測を生成し、ネットワークの内部状態を更新して、将来の予測でこの初期入力が考慮されるようにします。
エントリポイント関数lstmnet_predict_and_update.mは,単一のタイムステップ入力を受け取り,その入力を关数predictAndUpdateState
(深学习工具箱)を使用して处理します。predictAndUpdateState
は、入力タイム ステップについての予測を出力し、ネットワークを更新して、以降の入力が同じサンプルに続くタイム ステップとして扱われるようにします。すべてのタイム ステップを一度に渡した場合、結果の出力は、すべてのタイム ステップが単一の入力として渡された場合と同じになります。
类型('lstmnet_predict_and_update.m')
功能OUT = lstmnet_predict_and_update(上)%#代码生成%版权所有2019 MathWorks公司持久我的网;如果的isEmpty(我的网)我的网= coder.loadDeepLearningNetwork( 'lstmnet.mat');端%通过在输入[我的网,出] = predictAndUpdateState(我的网,在);
この新しい設計ファイルで 编码基因を実行します。呼び出しごとに単一のタイム ステップを受け取るため、matrixInput
を指定して,可変シーケンス长の代わりに,シーケンス次元を1に固定します。
matrixInput = coder.typeof(双(0),[3 1]);代码生成-configCFGlstmnet\u预测和更新-args{} matrixInput-报告
代码生成成功:要查看报告,请打开('codegen/mex/lstmnet\u predict\u and\u update/html/report.mldatx')。
最初の検証サンプルの最初のタイム ステップについて生成された 墨西哥を実行します。
firstSample = XValidate {1};firstTimestep = firstSample(:,1);YPredStateful = lstmnet_predict_and_update_mex(firstTimestep);[〜,maxIndex] = MAX(YPredStateful,[],1);predictedLabelsStateful1 =标签(maxIndex)
predictedLabelsStateful1 =绝对坐
出力ラベルをグラウンドトゥルースと比较します。
YValidate {1}(1)
ans=分类坐姿