romAI検証コーナー(その12)バッチトレーニング

Kosuke_IKEDA
Kosuke_IKEDA
Altair Employee

シンプルなモデルを使用して、romAIの機能をチェックしていきます。第12回はバッチトレーニングについて確認します。


バッチトレーニングとは

romAI 2022からの新機能です。OMLで設定を記述することで、パラメータを変更しながら連続でトレーニングを行うことができます。

 デモブラウザ内に3つのサンプルファイルが提供されています。

image



問題設定

第5回にニューロン数・レイヤー数のパラスタを行いました。

romAI検証コーナー(その5)ニューロン数・レイヤー数

レイヤー数1を固定して、ニューロン数を1~20の5ケース

ニューロン数を5に固定して、レイヤー数を1~4の4ケース

の合計8ケース実施しましたので、今回はこれをバッチトレーニングで行います。

  • [1]
  • [3]
  • [5]
  • [10]
  • [20]
  • [5,5]
  • [5,5,5]
  • [5,5,5,5]


OMLスクリプトの作成(基本)

サンプルファイルをベースに書き換えます。ベースとして、nonlin_register_batch.omlを使用しました。

基本的にGUIで設定していた項目と対応していますので、わかりやすいと思います。

フォルダ、ファイルの指定

トレーニングに使うcsvファイル、作成したromの書き出し先フォルダ、romの名前を指定します。

workdir = 'G:\data\Motion_Training\romAI_function_check_12_batch_training'  train_dataset_file = [workdir '\file.csv']; %romAI models are saved in the temp folder romAI_destination_folder = workdir; romAI_name = 'rom';  

入出力、状態量の指定

csvのラベルで指定します。今回はStatic ROMのため、状態量は無しです。

romAI_structure._inputs = {'u'}; romAI_structure._outputs = {'y'}; romAI_structure._states = {};

ニューラルネットの設定

活性化関数、レイヤー数、ニューロン数を指定します。

レイヤー数、ニューロン数はのちのfor loopで上書きしますが、一旦仮の値を設定しておきます。

romAI_math_model._type = 'nonlinear'; romAI_math_model._activation_fun = 'relu'; romAI_math_model._architecture._hidden_layers = 2; romAI_math_model._architecture._neurons_x_layer = [20,20];

トレーニングパラメータの設定

データの分割比やepoch数などを指定します。

romAI_training_params._output_normalization = true; romAI_training_params._early_stopping = true; romAI_training_params._test_split_ratio = 0.2; romAI_training_params._crossval_split_ratio = 0.25; romAI_training_params._reg_coeff = 0; romAI_training_params._learning_rate = 1e-3; romAI_training_params._epochs = 1000;  %defined in the for loop romAI_training_params._min_improvement = 1e-7;

トレーニングの実行

romAIdirector_batch()で先に設定したパラメータを参照すればトレーニングが実行できます。

今回はこのコマンドをfor loopの中に定義することで、パラメータを変えたトレーニングを連続実行します。

[loss,r2coeff]=romAIdirector_batch(train_dataset_file, romAI_destination_folder, romAI_name, romAI_structure, romAI_math_model,romAI_training_params);


OMLスクリプトの作成(応用)

for loopその1

まずは、レイヤー数1を固定した5ケースのfor loopを作成します。

  • [1]
  • [3]
  • [5]
  • [10]
  • [20]

事前に実施したいニューロン数のベクトルnneuronsを定義して、for loopの中でニューロン数を書き換えてトレーニングを実行しました。

romAIの出力ファイルはデフォルトでニューロン数、レイヤー数の情報が追記されますので、ファイル名の変更は不要ですが、他のパラメータを変更する場合は、ファイルが上書きされるため、for loop内でファイル名を変更する処理を追加してください。

nneurons = [1 3 5 10 20]';  romAI_math_model._architecture._hidden_layers = 1; %training for ii=1:size(nneurons,1)          nneurons(ii,1) 	romAI_math_model._architecture._neurons_x_layer = [nneurons(ii,1)];  	tic; 	[loss,r2coeff]=romAIdirector_batch(train_dataset_file, romAI_destination_folder,... 									   romAI_name, romAI_structure, romAI_math_model,... 									   romAI_training_params); 	losses(ii) = loss; 	r2coeffs(ii) = r2coeff; 	toc end 

for loopその2

続いて、ニューロン数を固定したレイヤー数違い3ケースのfor loopを作成します。

  • [5,5]
  • [5,5,5]
  • [5,5,5,5]

事前に実施したいレイヤー数数のベクトルnlayersを定義して、for loopの中でレイヤー数、ニューロン数を書き換えてトレーニングを実行しました。

nlayers = [2 3 4]'; for ii=1:size(nlayers,1)          nlayers(ii,1) 	romAI_math_model._architecture._hidden_layers =  nlayers(ii,1); 	romAI_math_model._architecture._neurons_x_layer = 5*ones(1,nlayers(ii,1));  	tic; 	[loss,r2coeff]=romAIdirector_batch(train_dataset_file, romAI_destination_folder,... 									   romAI_name, romAI_structure, romAI_math_model,... 									   romAI_training_params); 	losses(ii+size(nneurons,1)) = loss; 	r2coeffs(ii+size(nneurons,1)) = r2coeff; 	toc end

サマリーの作成

バッチ実行すると、損失lossや決定係数r2の情報が戻り値として取得できますので、実施したepoch数とloss、r2値のみ抽出し、csvファイルに書き出してみます。

summary = []; for ii=1:1:size(losses,2) 	summary(ii,:)=[ii losses(ii).epochs(end) losses(ii).train_loss.overall(end) r2coeffs(ii).output.y] ; end  fid=fopen([workdir '\summary.csv'],'w'); fprintf(fid,'no, epochs, train_loss, r2\n'); csvwrite(fid,summary); fclose(fid);


バッチトレーニングの実行

エディタの実行ボタンをクリックすると、8ケースのトレーニングが順番に実行され、フォルダに作成されたromが出力されます。

image

サマリーのcsvファイルは以下のような値が記述されます。

image


夜間や週末に複数ケース試したい場合は本機能ご利用ください。

データ分割や初期値が乱数で決定されますので、同じ設定でバッチトレーニングを行い結果を見比べるのもよいかもしれません。

本ブログで使用したスクリプトは下記よりご利用いただけます。

Comments

  • Kosuke_IKEDA
    Kosuke_IKEDA
    Altair Employee
    edited April 2022

    Altair ComposeのGUIでもromAIのスクリプティングが可能です。

    image

    Altair ComposeにromAIを追加する方法は下記ご参照ください。

    Altair ComposeでromAIを作成する方法

    使用製品:Altair Compose

  • Kosuke_IKEDA
    Kosuke_IKEDA
    Altair Employee
    edited September 2023

    ver.2022.3でromAIトレーニングの戻り値に変更がありました。

    loss.train_loss.overall -> loss.train_loss.y

    に変更されていますのでsummary作成のスクリプトの修正が必要です。

    summary = []; for ii=1:1:size(losses,2) 	summary(ii,:)=[ii losses(ii).epochs(end) losses(ii).train_loss.y(end) r2coeffs(ii).output.y] ; end  fid=fopen([workdir '\summary.csv'],'w'); fprintf(fid,'no, epochs, train_loss, r2\n'); csvwrite(fid,summary); fclose(fid);

    修正後のomlはこちらに添付しております。

    また、lossで指定した.yやr2coeffで指定した.output.yですが、モデルの状態量の有無や、出力により変わりますので、モデルに合わせて設定する必要があります。

    csvに書き出したい項目も抽出してください。