メインコンテンツ

バッテリーの SOC を推定するための深層学習ネットワークの学習

R2024b 以降

この例では、バッテリーの充電状態 (SOC) を予測するために深層ニューラル ネットワークに学習させる方法を示します。

SOC は、バッテリーの容量に対する充電レベルを割合として表したものです。この例では、温度、電圧、および電流に基づいてバッテリーの SOC を予測するために深層学習ネットワークに学習させる方法を示します。

この例は、バッテリーの SOC を推定するワークフローを説明する一連の例の 3 番目の手順です。各ステップを個別に実行することも、ステップを順番に実行することもできます。この例は、Prepare Data for Battery State of Charge Estimation Using Deep Learningの例に従います。ワークフロー全体の詳細については、深層学習を使用したバッテリー充電状態の推定を参照してください。

テスト データを読み込みます。前の手順を実行した場合、例では前の手順で準備したデータが使用されます。それ以外の場合、例ではPrepare Data for Battery State of Charge Estimation Using Deep Learningに従ってデータを準備します。

XTrainXVal は学習と検証の入力であり、各データ セットは 500 タイム ステップにわたる温度、電圧、および電流が格納された cell 配列です。YTrainYVal は学習と検証の出力であり、各データ セットは 500 タイムステップにわたる SOC が格納された cell 配列です。

if ~exist("XTrain","var") || ~exist("YTrain","var") || ~exist("XVal","var") || ~exist("YVal","var")
    [XTrain,YTrain,XVal,YVal] = prepareBSOCData;
end

ネットワーク アーキテクチャの定義

ネットワーク アーキテクチャを定義します。入力特徴の数を 3 つ (温度、電圧、および電流) に設定します。

numFeatures = 3;

出力特徴の数を 1 に設定します (SOC)。

numResponses = 1;

LSTM ニューラル ネットワークは、再帰型ニューラル ネットワーク (RNN) の一種で、シーケンス データのタイム ステップ間の長期的な依存関係を学習できます。この例では、2 つのブロックをもつ LSTM ネットワーク アーキテクチャを使用します。各ブロックは LSTM 層とそれに続くドロップアウト層で構成されています。ドロップアウト層は、過適合を回避するのに役立ちます。対話形式でネットワークを構築して可視化するには、ディープ ネットワーク デザイナーアプリを使用します。

layers = [...
    sequenceInputLayer(numFeatures)
    lstmLayer(256,OutputMode="sequence")
    dropoutLayer(0.2)
    lstmLayer(128,OutputMode="sequence")
    dropoutLayer(0.2)
    fullyConnectedLayer(numResponses)
    sigmoidLayer];

学習オプションの指定

学習オプションを指定します。オプションの中から選択するには、経験的解析が必要です。実験を実行してさまざまな学習オプションの構成を調べるには、実験マネージャーアプリを使用できます。

  • Adam 最適化を使用して学習させます。

  • 初期学習率 0.01 で学習させます。

  • 150 エポックにわたって学習させます。

  • ミニバッチ サイズ 32 で学習させます。

  • 各ミニバッチでシーケンスを左パディングし、シーケンスが同じ長さになるようにします。左パディングにより、シーケンスの最後にパディングされた値を RNN が予測することを防ぎます。

  • すべてのエポックでデータをシャッフルします。

  • 検証データを使用してパフォーマンスを監視します。

  • 学習の進行状況をプロットに表示します。

  • RMSE 値を追跡します。

  • 詳細出力を無効にします。

options = trainingOptions("adam", ...
    InitialLearnRate=0.01, ...
    MaxEpochs=150, ...
    MiniBatchSize=32, ...
    SequencePaddingDirection="left", ...
    Shuffle="every-epoch",...
    ValidationData={XVal,YVal}, ...
    ValidationFrequency=20, ...
    Plots="training-progress", ...
    Metrics="rmse", ...
    Verbose=false);

ネットワークの学習

関数trainnetを使用して LSTM ニューラル ネットワークに学習させます。シーケンス予測タスクでは、平均二乗誤差 (MSE) 損失を使用します。既定では、関数 trainnet は利用可能な GPU がある場合にそれを使用します。GPU を使用するには、Parallel Computing Toolbox™ ライセンスとサポートされている GPU デバイスが必要です。サポートされているデバイスの詳細については、GPU 計算の要件 (Parallel Computing Toolbox)を参照してください。そうでない場合、関数は CPU を使用します。実行環境を指定するには、ExecutionEnvironment 学習オプションを使用します。

ネットワークに学習させるには、doTraining フラグを true に設定します。そうでない場合は、事前学習済みのネットワークを読み込みます。

doTraining = false;

if doTraining
    recurrentNet = trainnet(XTrain,YTrain,layers,"mse",options);
else
    load("pretrainedBSOCNetwork.mat")
end

学習済みのネットワークを予測に使用する準備が整いました。ネットワークをテストするには、バッテリーの SOC を推定するための深層学習ネットワークの学習を参照してください。別の方法として、まずネットワークを圧縮してサイズを縮小するには、Compress Deep Learning Network for Battery State of Charge Estimationを参照してください。openExample 関数を使用して次の例を開くこともできます。

openExample("deeplearning_shared/CompressModelForBatteryStateOfChargeEstimationExample")
openExample("deeplearning_shared/TestModelForBatteryStateOfChargeEstimationExample")

オプションとして、Requirements Toolbox™ をお持ちの場合は、次のセクションで、ネットワーク アーキテクチャの要件をリンクしてテストできます。

Requirements Toolbox を使用したネットワーク アーキテクチャ要件のリンク

このセクションでは、AI コンポーネントの要件をネットワークにリンクします。また、Requirements Toolbox™ と MATLAB Test™ が必要です。このセクションでは、要件の作成方法やリンク方法は示さず、リンクの実装と検証を行う方法のみを示します。これらの要件の定義の詳細については、Define Requirements for Battery State of Charge Estimationを参照してください。要件の作成方法および管理方法に関する一般的な情報については、要件を使用した MATLAB 関数の開発と検証 (Requirements Toolbox)を参照してください。

要件をリンクすることは、ネットワーク要件を実装まで追跡し、テストを通じて検証できるようにするために重要です。

Requirements Toolbox™ のライセンスを確認します。

if ~license("test","simulink_requirements")    
    disp("This part of the example requires Requirements Toolbox.");    
    return
end

学習済みのネットワークを保存します。

save("recurrentNetworkTest","recurrentNet");

この例では、ネットワークは 1 行 3 列の配列を入力として受け取り、単一の配列 (SOC) を出力しなければなりません。

ネットワーク アーキテクチャの要件を開きます。要件の実装および検証ステータスを示す列を追加するには、 をクリックしてから、[実装ステータス][検証ステータス] を選択します。黄色のバナーが表示された場合は、[今すぐ分析] をクリックします。各要件とその実装ステータスおよび検証ステータスを確認できます。各要件の検証ステータスは黄色で、ステータスが不明であることを示しています。要件が満たされなかった場合はステータスが赤に変わり、満たされた場合にステータスが緑に変わります。

open("testNetworkRequirements.m")
slreq.open("BatterySOCReqNetArch.slreqx");

ネットワーク要件の 1 つを選択します。各要件は NetworkInputOutputJustification によって実装され、テストによって検証されます。

要件の実装

適切な入力サイズと出力サイズをもつネットワークを作成して、要件を実装しました。この正当化は、要件エディターで NetworkInputOutputJustification を選択すると確認できます。

要件の確認

次のステップは要件を確認することです。要件を確認するには、ネットワーク アーキテクチャをチェックするテストを作成します。ネットワーク アーキテクチャ テストは、この例にサポート ファイルとして添付されている testNetworkRequirements ファイルにあります。ファイルには次の 2 つのテストが含まれています。

  • testNetworkInput — モデルが 1 行 3 列の配列を入力として受け入れることをテストします。

  • testNetworkOutput — モデルが単一の出力を返すことをテストします。

        function testNetworkInput(testCase)
            net = testCase.recurrentNetwork;
           
            inputSize = net.Layers(1).InputSize;
            verifyEqual(testCase,inputSize,3);
        end

        function testNetworkOutput(testCase)
            net = testCase.recurrentNetwork;

            outputSize = size(forward(net,dlarray([0.5 0.5 0.5],"TC")));
            verifyEqual(testCase,outputSize,[1 1]);
        end

テスト ファイルを開くと、ソフトウェアによってテスト名が強調表示されていることがわかります。強調表示されたテストは要件にリンクされています。テストがどの要件にリンクしているかを確認するには、行を右クリックして [要件] を選択します。

要件エディターで、要件セット BatterySOCReqNetArch を右クリックし、[テストの実行] をクリックします。[テストの実行] ダイアログボックスで、testNetworkInput テストと testNetworkOutput テストを選択し、[テストの実行] をクリックします。

テストでは、各ネットワーク要件が満たされているかどうかがチェックされ、検証ステータスが緑色 (合格) に変わります。

次のステップ: Test Deep Learning Network for Battery State of Charge EstimationまたはCompress Deep Learning Network for Battery State of Charge Estimation (オプション)。openExample 関数を使用して次の例を開くこともできます。

openExample("deeplearning_shared/CompressModelForBatteryStateOfChargeEstimationExample")
openExample("deeplearning_shared/TestModelForBatteryStateOfChargeEstimationExample")

参考

(Requirements Toolbox) | | | |

トピック