Main Content

ニューラル ネットワーク回帰モデルの FPGA/ASIC プラットフォームへの展開

この例では、ニューラル ネットワーク回帰モデルに学習させ、学習させた回帰モデルをバッテリーの SOC を推定する Simulink® モデルで使用して、その Simulink モデルから FPGA/ASIC (フィールド プログラマブル ゲート アレイ/特定用途向け集積回路) プラットフォームへの展開用の HDL コードを生成する方法を示します。

充電状態 (SoC) は、電気バッテリーの充電レベルを容量に対する割合として測定したものです。車両のエネルギー マネジメント システムには SoC が不可欠です。SoC は直接は測定できないため、推定が必要になります。信頼性に優れた手頃な電動車 (xEV) を実現するには、SoC の推定が正確でなければなりません。しかし、リチウムイオン バッテリーの温度、健全性、および SoC 依存動作は非線形であるため、SoC の推定は自動車エンジニアリングにおいて大きな課題のままとなっています。この問題に対する従来の電気化学モデルなどのアプローチでは、通常、バッテリーの組成や物理的応答についての正確なパラメーターと知識が必要になります。

一方、ニューラル ネットワークによる SoC のモデル化は、データ駆動型のアプローチであり、バッテリーやその非線形特性についての必要な知識が最小限で済みます[1]。この例では、ニューラル ネットワーク回帰モデルを使用して、バッテリーの電流、電圧、および温度の測定値から SoC を予測します[2]

この例の Simulink モデルには、バッテリーのプラント シミュレーションとバッテリー マネジメント システム (BMS) が含まれています。BMS はバッテリーの状態を監視してバッテリー温度を管理し、バッテリーを安全な作動状態に保ちます。たとえば、BMS は過充電や過放電の防止に役立ちます。BMS では、バッテリーのセンサーから閉ループ システムで電流、電圧、および温度の情報を収集します。

bms.png

コマンド ラインでの回帰モデルの学習

最初に、この例のデータ セットを読み込みます。その後、コマンド ラインで回帰モデルに学習させ、モデルの性能を評価します。

データ セットの読み込み

この例では、[1] のデータ セットのサブセットである batterySmall データ セットを使用します。batterySmall データ セットには、trainDataSmall (学習データ セット) と testDataSmall (テスト データ セット) の 2 つのテーブルがあります。学習データ セットとテスト データ セットの両方に、さまざまな温度範囲の平衡化された表現が含まれています。どちらのデータ セットの観測値も正規化されています。

batterySmall データ セットを読み込みます。

load batterysmall.mat

テーブル trainDataSmalltestDataSmall の最初の 8 行を表示します。

head(trainDataSmall)
       V          I        Temp       V_avg      I_avg        Y   
    _______    _______    _______    _______    _______    _______

     0.3855    0.75102    0.49157    0.38535    0.75102    0.20642
    0.38704    0.75102    0.85766    0.38571    0.75102    0.20642
    0.38709    0.75102    0.85824    0.38572    0.75102    0.20642
    0.38924    0.75102    0.85628    0.38658    0.75102    0.20642
    0.39174    0.75102    0.90589    0.38919    0.75102    0.20642
    0.39338    0.75102    0.90368    0.39149    0.75102    0.20642
    0.39508    0.75102    0.91501     0.3939    0.75102    0.20642
    0.39529    0.75102    0.91306    0.39417    0.75102    0.20642
head(testDataSmall)
       V          I         Temp        V_avg      I_avg        Y   
    _______    _______    _________    _______    _______    _______

    0.68309    0.63084    0.0084771     0.8907    0.72464    0.99725
    0.74425    0.70388      0.01131    0.87824     0.7214     0.9958
    0.76465    0.69525     0.014143    0.85308    0.71765     0.9915
    0.91283    0.74702     0.014143    0.86508    0.72354    0.99175
    0.81809    0.71665     0.014143    0.86544    0.72384    0.98893
    0.63116    0.58937     0.016976    0.86426    0.72321    0.98804
    0.55114     0.5736     0.031141     0.7997    0.69442    0.96458
    0.90598    0.80312     0.033973    0.79805    0.69475    0.96337

どちらのテーブルにも、バッテリーのセンサーのデータである電圧 (V)、電流 (I)、温度 (Temp)、平均電圧 (V_avg)、および平均電流 (I_avg) の変数が格納されています。さらに、両方のテーブルに Y で表される充電状態 (SoC) の変数があります。

回帰モデルの学習

関数fitrnetを使用して、学習データ セットでニューラル ネットワーク回帰モデルに学習させます。ニューラル ネットワーク モデル内の隠れ全結合層のサイズを指定します。

nnetMdl = fitrnet(trainDataSmall,"Y",LayerSizes=[10,10]);

nnetMdlRegressionNeuralNetwork モデルです。

モデルの性能の評価

学習させたモデルに対して 5 分割の交差検証を使用して交差検証を実行し、交差検証分類の精度を評価します。

partitionedModel = crossval(nnetMdl,KFold=5);
validationAccuracy = 1-kfoldLoss(partitionedModel)
validationAccuracy = 0.9993

テスト セットの精度を計算して、学習済みモデルの一般化の精度を評価します。

testAccuracy = 1-loss(nnetMdl,testDataSmall,"Y")
testAccuracy = 0.9994

テスト セットの精度が 99.9% を超えており、モデルが学習セットに対して過適合にはなっていないことがわかります。

予測のための Simulink へのモデルのインポート

この例では、バッテリーの SoC を推定するためのRegressionNeuralNetwork Predictブロックを含む Simulink モデル slexFPGAPredictExample が用意されています。推定された SoC と比較できるように、測定された SoC もモデルに含まれています。

slexFPGAPredictExample.png

データの読み込み

batterySmall データ セットには、入力データ (X) と測定された SoC (Y) をもつ構造体 dataLarge が含まれています。X のデータを使用して slexFPGAPredictExample モデルへの入力データを作成します。

Simulink モデルの配列の形式で入力信号 (input) を作成します。配列の最初の列には、観測値がモデルに入力された時点を含む timeVector 変数が格納されます。配列の他の 5 つの列にバッテリーの測定値の変数が格納されます。

timeVector = (0:length(dataLarge.X)-1)';
input = [timeVector,dataLarge.X];
measuredSOC = [timeVector dataLarge.Y];

input の非正規化に使用する生の入力データの最小値と最大値を読み込みます。

minmaxData = load("MinMaxVectors");
X_MIN = minmaxData.X_MIN;
X_MAX = minmaxData.X_MAX;
stepSize = 10;

Simulink モデルのシミュレート

Simulink モデル slexFPGAPredictExample を開きます。モデルをシミュレートし、シミュレーション出力をワークスペースにエクスポートします。

open_system("slexFPGAPredictExample.slx")
simOut = sim("slexFPGAPredictExample.slx");

バッテリーの SoC のシミュレーション値と測定値をプロットします。

sim_ypred = simOut.yout.get("estim").Values.Data;

plot(simOut.tout,sim_ypred)
hold on
plot(dataLarge.Y)
hold off
legend("Simulated SoC","Measured SoC",location="northwest")

Simulink モデルの固定小数点への変換

Simulink モデルを浮動小数点サポートがない FPGA または ASIC ハードウェアに展開するには、RegressionNeuralNetwork Predict ブロックを固定小数点に変換する必要があります。固定小数点ツールを使用した固定小数点モデルの再スケーリング (Fixed-Point Designer)を使用して Neural Network サブシステムを固定小数点に変換できます。また、RegressionNeuralNetwork Predict ブロックのダイアログ ボックスの [データ型] タブを使用して固定小数点の値を直接指定することもできます。固定小数点に変換する方法の詳細については、固定小数点展開用の行動認識 Simulink モデルを参照してください。

Simulink モデル slexFPGAPredictFixedPointExample を開きます。これは固定小数点に既に変換されています。固定小数点の Simulink モデルをシミュレートし、シミュレーション出力をワークスペースにエクスポートします。

open_system("slexFPGAPredictFixedPointExample.slx")
simOutFixedPoint = sim("slexFPGAPredictFixedPointExample.slx");

バッテリーの SoC の推定についての浮動小数点 (soc_dl) と固定小数点 (soc_fp) のシミュレーション結果を比較します。

soc_dl_sig = simOut.yout.getElement(1);
soc_fp_sig = simOutFixedPoint.yout.getElement(1);
soc_dl = soc_dl_sig.Values.Data;
soc_fp = soc_fp_sig.Values.Data;
max(abs(soc_dl-soc_fp)./soc_dl)
ans = 0.0371

この結果から、SoC の推定についての浮動小数点と固定小数点の値の差が 4% 未満であることがわかります。

HDL コード生成用の Simulink モデルの準備

RegressionNeuralNetwork Predict ブロックを HDL コード生成用に準備するには、HDL コード アドバイザーを開いて実行します。詳細については、HDL コード アドバイザーを使用した Simulink モデルの HDL 互換性のチェック (HDL Coder)を参照してください。

neural network サブシステムを右クリックし、[HDL コード]、[HDL コード アドバイザー] を選択して HDL コード アドバイザーを開きます。代わりに、次のように入力することもできます。

open_system("slexFPGAPredictFixedPointExample.slx")
hdlcodeadvisor("slexFPGAPredictFixedPointExample/Neural Network")
Updating Model Advisor cache...
Model Advisor cache updated. For new customizations, to update the cache, use the Advisor.Manager.refresh_customizations method.

hdl_code_advisor1.png

HDL コード アドバイザーの左側のペインに階層内のフォルダーのリストが表示されます。各フォルダーは、関連するチェックのグループまたはカテゴリを表しています。フォルダーを展開すると各グループで使用可能なチェックが表示されます。左側のペインですべてのチェックが選択されていることを確認してから、右側のペインで [選択したチェックを実行] をクリックします。

HDL コード アドバイザーでエラーまたは警告が返されると、それに応じて対応するフォルダーがマークされます。各グループを展開して、失敗したチェックを確認します。エラーを修正するには、右側のペインで [このチェックを実行] をクリックします。次に、[設定の変更] をクリックします。変更した設定を適用した後、[このチェックを実行] を再度クリックします。次のリストの失敗した各チェックについて、このプロセスを繰り返します。

[業界標準チェック] グループの失敗したチェック:

  • クロック、リセット、イネーブル信号をチェック - このチェックでは、クロック信号、リセット信号、およびイネーブル信号が推奨される命名規則に従っているかどうかを検証します。

  • パッケージ ファイル名をチェック

  • 信号と端子の名前をチェック

  • 最上位サブシステム/端子名をチェック

提案された設定を適用した後、すべてのチェックをもう一度実行してパスすることを確認します。

HDL コードの生成

この例では、HDL コード生成用の準備が完了した Simulink モデル slexFPGAPredictReadyExample が用意されています。Simulink モデルを開きます。

open_system("slexFPGAPredictReadyExample.slx")

neural network サブシステムの HDL コードを生成するには、サブシステムを右クリックして [HDL コード]、[サブシステムに対する HDL を生成] を選択します。コード生成が完了すると、コード生成レポートが開きます。レポートには、生成されたソース ファイル、およびコードの効率に関する各種レポートが含まれています。

hdl_code_generation_report.png

ハードウェアでの効率的なリソース使用のためのモデルの最適化

生成されたレポート [高水準リソース レポート] を開きます。HDL コード アドバイザーで行列とベクトルの演算にフラグが付けられたため、この Simulink モデルでは多数の乗算器と加算器/減算器が使用されています。リソースの使用を最適化するために、HDL コードの生成前にモデルに対してストリーミングを有効にすることができます。ストリーミングを有効にすると、より少ない数のハードウェア リソースにデータを多重化することで生成コードのチップ面積を節約できます。つまり、ストリーミングによっていくつかの計算でハードウェア リソースを共有できます。

ストリーミングによって利点が得られるサブシステムは次のとおりです。

  • neural network/RegressionNeuralNetwork Predict/getScore/hiddenLayers/hiddenLayer1

  • neural network/RegressionNeuralNetwork Predict/getScore/hiddenLayers/hiddenLayer2

これらの 2 つのサブシステムに対してストリーミングを有効にするには、それぞれのサブシステムについて次の手順を実行します。

  1. サブシステム (hiddenLayer1 または hiddenLayer2) を右クリックし、[HDL コード]、[HDL ブロック プロパティ] を選択します。

  2. 開いたダイアログ ボックスで、それぞれの隠れ層に 10 個のニューロンがあるため、[StreamingFactor] オプションを 0 から 10 に変更します。

  3. [OK] をクリックします。

hdl_block_dialog.png

HDL コードを再度生成し、[高水準リソース レポート] で乗算器と加算器/減算器の数が少なくなったことを確認します。生成されたレポートでストリーミングを使用するモデルの自動生成されたバージョンを開くには、[ストリーミングおよび共有] レポートを開き、[変換後に生成されたモデル] のリンクにある自動生成されたモデルのリンクをクリックします。サブシステムの変更内容を確認するには、次に移動します。

/neural network/RegressionNeuralNetwork Predict/getScore/hiddenLayers/hiddenLayer1

自動生成されたモデルを実行するには、元の Simulink モデル slexFPGAPredictExample のマスク ワークスペースに格納されているニューラル ネットワーク モデルのパラメーターを抽出しなければなりません。それらのパラメーターをベース ワークスペースに含める必要があります。

blockName = "slexFPGAPredictReadyExample/neural network/RegressionNeuralNetwork Predict";
bmw = Simulink.Mask.get(blockName);
mv = bmw.getWorkspaceVariables;
learnerParams = mv(end).Value;

新しいニューラル ネットワーク モデルの展開

新しいニューラル ネットワーク モデルに別の設定 (別の活性化関数、隠れ層の数、隠れ層のサイズなど) で学習させる場合は、この例の手順を最初から実行して新しいモデルを展開します。HDL Coder の最適化 (HDL コード生成の前に実行) は、新しいモデルのアーキテクチャ、ターゲット ハードウェア、その他の要件に応じて異なる場合があります。

参照

[1] Kollmeyer, Phillip, Carlos Vidal, Mina Naguib, and Michael Skells. "LG 18650HG2 Li-ion Battery Data and Example Deep Neural Network xEV SOC Estimator Script." Mendeley 3 (March 2020). https://doi.org/10.17632/CP3473X7XV.3.

[2] Vezzini, Andrea. "Lithium-Ion Battery Management." In Lithium-Ion Batteries, edited by Gianfranco Pistoia, 345-360. Elsevier, 2014. https://doi.org/10.1016/B978-0-444-59513-3.00015-7.

参考

| |

関連するトピック