Main Content

ニューラル ネットワーク アルゴリズムの固定小数点への変換と C コードの生成

この例では、固定小数点ツールとルックアップ テーブル オプティマイザーを使用して Simulink のニューラル ネットワーク回帰モデルを変換し、Simulink Coder を使用して C コードを生成する方法を示します。

概要

Fixed-Point Designer は、設計を浮動小数点データ型から固定小数点データ型に変換できる固定小数点ツールを使用したワークフローを提供します。ルックアップ テーブル オプティマイザーでは、explog2 などの境界がない関数に対してメモリ効率が高いルックアップ テーブル置換を生成します。この例では、これらのツールを使用して、学習済みの浮動小数点ニューラル ネットワークの回帰モデルを変換し、組み込み効率の良い固定小数点データ型を使用します。

データとニューラル ネットワークの学習

engine_dataset には、エンジンの燃料比と速度、およびそのトルクと排ガスの関係を表すデータが含まれています。

load engine_dataset;

Deep Learning Toolbox™ から関数近似ツール nftool を使用してニューラル ネットワークを学習させ、指定された燃料比と速度における、エンジンのトルクと排ガスを推定します。次のコマンドを使用して、ニューラル ネットワークを学習させます。

x = engineInputs;
t = engineTargets;
net = fitnet(10);
net = train(net,x,t);
view(net)

ネットワークのビューを閉じます。

nnet.guis.closeAllViews();

固定小数点の変換のためのモデルの準備

ネットワークに学習させたら、Deep Learning Toolbox™ から関数 gensim を使用して Simulink モデルを生成します。

sys_name = gensim(net, 'Name', 'mTrainedNN');

関数 gensim で生成されたモデルには、重みとバイアスを学習したニューラル ネットワークが含まれます。この生成されたモデルを固定小数点の変換用に準備するためには、ベストプラクティス ガイドラインの準備ステップに従います。https://www.mathworks.com/help/fixedpoint/ug/best-practices-for-using-the-fixed-point-tool-to-propose-data-types-for-your-simulink-model.html

これらの原則を適用した後に、学習済みニューラル ネットワークをさらに変更して、ネットワークの出力で信号のログを有効にし、入力スティミュラスと検証ブロックを追加します。

モデルを開いて検証します。

model = 'ex_fxpdemo_neuralnet_regression';
system_under_design = [model '/Function Fitting Neural Network'];
baseline_output = [model '/yarr'];
open_system(model);

固定小数点ツールを開くには Function Fitting Neural Network サブシステムを右クリックし、[固定小数点ツール] を選択します。または固定小数点ツールのコマンド ライン インターフェイスを使用します。固定小数点およびコマンド ライン インターフェイスは、シミュレーションと範囲解析によるオブジェクトの固定小数点の変換範囲とオーバーフロー計測、固定小数点データ型指定の同種語長調査、および追加のオーバーフロー診断についてモデルを準備するためのワークフロー ステップを提供します。

converter = DataTypeWorkflow.Converter(system_under_design);

範囲を収集するためのシミュレーションの実行

範囲を収集する計測でモデルをシミュレーションします。これは、ツールの [範囲の収集] ボタンをクリックするか、次のコマンドで行います。

converter.applySettingsFromShortcut('Range collection using double override');

% Save simulation run name generated as collect_ranges. This run name is used in
% later steps to propose fixed point data types.
collect_ranges = converter.CurrentRunName;
sim_out = converter.simulateSystem();

変換の前に回帰精度をプロットします。

plotRegression(sim_out, baseline_output, system_under_design, 'Regression before conversion');

固定小数点データ型の推奨

シミュレーションから得られた範囲情報は、設計対象システムのブロックの固定小数点データ型を推奨するために固定小数点ツールによって使用されることがあります。この例では、サブシステム内のすべてのブロックに対して符号付きデータ型が推奨されるように、ProposalSettings オブジェクトで ProposeSignedness オプションを無効にします。

ps = DataTypeWorkflow.ProposalSettings;
ps.ProposeSignedness  = false;
converter.proposeDataTypes(collect_ranges, ps);

推奨されたデータ型の適用

既定では、固定小数点ツールはすべての推奨されたデータ型を適用します。applyDataTypes メソッドを使用してデータ型を適用します。推奨のサブセットの適用のみ実行するには、固定小数点ツールで [確定] チェック ボックスを使用して、適用する推奨を指定します。

converter.applyDataTypes(collect_ranges);

データ型の検証

推奨された型は考えられるすべての入力を正しく処理する必要があります。新たに適用された型を使用してシミュレーションするモデルを設定し、ニューラル ネットワークの回帰精度が固定小数点の変換後も保持されているか確認します。

converter.applySettingsFromShortcut('Range collection with specified data types');
sim_out = converter.simulateSystem();

固定小数点モデルの回帰精度をプロットします。

plotRegression(sim_out, baseline_output, system_under_design, 'Regression after conversion');

活性化関数と最適化されたルックアップ テーブルとの置き換え

レイヤ 1 の活性化関数 Tanh をルックアップ テーブルまたは CORDIC 実装に置き換えて、固定小数点のコード生成を効率化することができます。この例では、ルックアップ テーブル オプティマイザーを使用して、tanh を置き換えるルックアップ テーブルを取得します。実行速度を高速化するために EvenPow2Spacing を使用します。詳細については、https://www.mathworks.com/help/fixedpoint/ref/functionapproximation.options-class.html を参照してください。

block_path = [system_under_design '/Layer 1/tansig'];
p = FunctionApproximation.Problem(block_path);
p.Options.WordLengths = 16;
p.Options.BreakpointSpecification = 'EvenPow2Spacing';
solution  = p.solve;
solution.replaceWithApproximate;
|  ID |  Memory (bits) | Feasible | Table Size | Breakpoints WLs | TableData WL | BreakpointSpecification |             Error(Max,Current) | 
|   0 |             64 |        0 |          2 |              16 |           16 |         EvenPow2Spacing |     7.812500e-03, 1.000000e+00 |
|   1 |           8224 |        1 |        512 |              16 |           16 |         EvenPow2Spacing |     7.812500e-03, 5.981445e-03 |
|   2 |           4128 |        0 |        256 |              16 |           16 |         EvenPow2Spacing |     7.812500e-03, 2.331543e-02 |

Best Solution
|  ID |  Memory (bits) | Feasible | Table Size | Breakpoints WLs | TableData WL | BreakpointSpecification |             Error(Max,Current) |
|   1 |           8224 |        1 |        512 |              16 |           16 |         EvenPow2Spacing |     7.812500e-03, 5.981445e-03 |

関数の近似置換後にモデルの精度を確認します。

converter.applySettingsFromShortcut(converter.ShortcutsForSelectedSystem{2});
sim_out = converter.simulateSystem;

回帰精度をプロットします。

plotRegression(sim_out, baseline_output, system_under_design, 'Regression after function replacement');

C コードの生成

Simulink Coder™ を使用して C コードを生成するには、Function Fitting Neural Network サブシステムを右クリックし、[C/C++ コード]、[サブシステムのビルド] を選択してから、調整可能なパラメーターを求めるプロンプトが表示されたら [ビルド] ボタンをクリックします。次のコマンドを使用してコードを生成することもできます。slbuild('fxpdemo_neuralnet_regression_toconvert/Function Fitting Neural Network')