テキスト データを分類する LSTM ネットワークのコード生成
この例では、テキスト データを分類する事前学習済みの長短期記憶 (LSTM) ネットワークの汎用 C コードを生成する方法を説明します。この例では、入力 timeseries の各ステップについて予測を行う MEX 関数を生成します。この例では、2 つの方法を説明します。1 番目の方法は、標準の LSTM ネットワークを使用します。2 番目の方法は、同じ LSTM ネットワークのステートフルな動作を利用します。この例では、出荷時のイベントを説明するテキストを使用して次の 4 つのカテゴリのいずれかに分類します。Electronic Failure、Leak、Mechanical Failure、Software Failure。事前学習済みの LSTM ネットワークの詳細については、深層学習を使用したテキスト データの分類 (Text Analytics Toolbox)を参照してください。
この例は、Mac®、Linux®、および Windows® の各プラットフォームでサポートされていますが、MATLAB® Online™ ではサポートされていません。
入力の準備
wordEncoding
MAT ファイルを読み込みます。この MAT ファイルには、数値インデックスとして符号化された単語が格納されています。この符号化は、ネットワークの学習中に実行されました。詳細については、深層学習を使用したテキスト データの分類 (Text Analytics Toolbox)を参照してください。
load("wordEncoding.mat");
新しいレポートを含む string 配列を作成し、イベント タイプを分類します。
reportsNew = [ ... "Coolant is pooling underneath sorter." "Sorter blows fuses at start up." "There are some very loud rattling sounds coming from the assembler." "At times mechanical arrangement software freezes." "Mixer output is stuck."];
関数 preprocessText
を使用して、入力文字列をトークン化します。
documentsNew = preprocessText(reportsNew);
関数doc2sequence
(Text Analytics Toolbox)を使用して、ドキュメントをシーケンスに変換します。
XNew = doc2sequence(enc,documentsNew); labels = categorical({'Electronic Failure', 'Leak', 'Mechanical Failure', 'Software Failure'});
lstm_predict
エントリポイント関数
sequence-to-sequence LSTM ネットワークでは、データ シーケンスの個々のタイム ステップで異なる予測を行うことができます。エントリポイント関数 lstm_predict.m
は、入力シーケンスを受け取り、予測用の学習済み LSTM ネットワークに渡します。具体的には、関数は深層学習を使用したテキスト データの分類 (Text Analytics Toolbox)の例で学習させる LSTM ネットワークを使用します。関数は、textClassifierNetwork.mat
ファイルからネットワーク オブジェクトを永続変数に読み込んでから、予測を実行します。それ以降の呼び出しでは、関数はこの永続オブジェクトを再利用します。
type('lstm_predict.m')
function out = lstm_predict(in) %#codegen % Copyright 2020-2024 The MathWorks, Inc. dlIn = dlarray(in,'CT'); persistent dlnet; if isempty(dlnet) dlnet = coder.loadDeepLearningNetwork('textClassifierNetwork.mat'); end dlOut = predict(dlnet, dlIn); out = extractdata(dlOut); end
ネットワーク アーキテクチャの対話的な可視化とネットワーク層についての詳細情報を表示するには、関数analyzeNetwork
(Deep Learning Toolbox)を使用します。
MEX の生成
コードを生成するには、MEX ターゲットのコード構成オブジェクトを作成し、ターゲット言語を C に設定します。関数 coder.DeepLearningConfig
を使用して、サードパーティのライブラリに依存しない深層学習構成オブジェクトを作成します。これをコード構成オブジェクトの DeepLearningConfig
プロパティに割り当てます。
cfg = coder.config('mex'); cfg.TargetLang = 'C'; cfg.IntegrityChecks = false; cfg.DeepLearningConfig = coder.DeepLearningConfig(TargetLibrary = 'none');
関数coder.typeof
を使用してエントリポイント関数への入力引数の型とサイズを指定します。この例では、入力は、特徴次元値 1 と可変のシーケンス長をもつ single のデータ型です。
matrixInput = coder.typeof(single(0),[1 Inf],[false true]);
codegen
コマンドを実行して、MEX 関数を生成します。
codegen -config cfg lstm_predict -args {matrixInput} -report
Code generation successful: View report
生成された MEX の実行
最初の観測値について lstm_predict_mex
を呼び出します。
YPred1 = lstm_predict_mex(single(XNew{1}));
YPred1
には、4 つのクラスの確率が含まれています。最大確率のインデックスを計算して、予測されたクラスを見つけます。
[~, maxIndex] = max(YPred1);
最大確率のインデックスを対応するラベルに関連付けます。分類を表示します。結果から、ネットワークが最初のイベントを Leak と予測したことがわかります。
predictedLabels1 = labels(maxIndex); disp(predictedLabels1)
Leak
ステートフルな LSTM を使用した MEX の生成
timeseries 全体を渡して 1 ステップで予測する代わりに、dlnetwork
の状態を更新して 1 タイムステップずつストリーミングすることにより、入力についての予測を実行できます。関数predict
(Deep Learning Toolbox)を使用することにより、更新されたネットワーク状態とともに出力予測を生成することができます。この関数 lstm_predict_and_update
は、単一のタイムステップ入力を受け取り、以降の入力が同じサンプルに続くタイムステップとして扱われるようにネットワークの状態を更新します。すべてのタイム ステップを一度に渡した場合、結果の出力は、すべてのタイム ステップが単一の入力として渡された場合と同じになります。
type('lstm_predict_and_update.m')
function out = lstm_predict_and_update(in) %#codegen % Copyright 2020-2024 The MathWorks, Inc. dlIn = dlarray(in,'CT'); persistent dlnet; if isempty(dlnet) dlnet = coder.loadDeepLearningNetwork('textClassifierNetwork.mat'); end [dlOut, updatedState] = predict(dlnet, dlIn); dlnet.State = updatedState; out = extractdata(dlOut); end
lstm_predict_and_update
のコードを生成します。この関数は、呼び出しごとに単一のタイムステップを受け入れるため、matrixInput
を、可変のシーケンス長ではなく固定のシーケンス次元 1 になるように指定します。
matrixInput = coder.typeof(single(0),[1 1]); codegen -config cfg lstm_predict_and_update -args {matrixInput} -report
Code generation successful: View report
最初の観測値で生成された MEX を実行します。
sequenceLength = size(XNew{1},2); for i=1:sequenceLength inTimeStep = XNew{1}(:,i); YPred3 = lstm_predict_and_update_mex(single(inTimeStep)); end clear lstm_predict_and_update_mex;
確率が最も高いインデックスを見つけて、ラベルにマッピングします。
[~, maxIndex] = max(YPred3); predictedLabels3 = labels(maxIndex); disp(predictedLabels3)
Leak
参考
coder.DeepLearningConfig
| doc2sequence
(Text Analytics Toolbox) | coder.typeof
| codegen
トピック
- 深層学習を使用したテキスト データの分類 (Text Analytics Toolbox)
- 深層学習に MATLAB Coder を使用するための前提条件