romAI検証コーナー(その12)バッチトレーニング
シンプルなモデルを使用して、romAIの機能をチェックしていきます。第12回はバッチトレーニングについて確認します。
バッチトレーニングとは
romAI 2022からの新機能です。OMLで設定を記述することで、パラメータを変更しながら連続でトレーニングを行うことができます。
デモブラウザ内に3つのサンプルファイルが提供されています。
問題設定
第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が出力されます。
サマリーのcsvファイルは以下のような値が記述されます。
夜間や週末に複数ケース試したい場合は本機能ご利用ください。
データ分割や初期値が乱数で決定されますので、同じ設定でバッチトレーニングを行い結果を見比べるのもよいかもしれません。
本ブログで使用したスクリプトは下記よりご利用いただけます。
Comments
-
0
-
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に書き出したい項目も抽出してください。
0