ニューラルネットワークを用いた回帰曲線の学習をMATLABで行いたい.
コマンドfitrnet
の利用して行う.
全結合レイヤーと活性化関数reluによるネットワークの構成のサンプルは次の通りである.
ただし,入力データを1次元,出力データを1次元としている.
コマンドfitrnet
の利用した場合はネットワークの構成は変更できない.
カスタムなネットワーク構成はオブジェクトdlnetwork
を利用する.
sample_fitrnet_dim1.m
clc
close all
rng("default");
% 入力の次元
dim_in=1;
% 出力の次元
dim_out=1;
% 学習データの個数
num_train=640;
% 表示
Verbose=true;
% 学習中の損失グラフの表示ON/OFF
ProgressFigure=true;
%% 学習データの生成
x_train=4*rand(num_train,dim_in)-1;
y_train=func_dim1(x_train);
fig1=figure;
func_fig_data(fig1,x_train,y_train,'学習データ:y=f(x)');
%% 隠れ層の出力数
layer_sizes=[15 15 15];
%% 学習
model=fitrnet(x_train,y_train, ...
"LayerSizes",layer_sizes, ...
"Standardize",true,"Verbose",Verbose);
%% 学習途中のMSEの履歴
mse_train=loss(model,x_train,y_train);
if ProgressFigure
fig2=figure;
func_fig_semilogy(fig2,model.TrainingHistory.Iteration, ...
model.TrainingHistory.TrainingLoss, ...
'反復回数','損失MSE','学習中の損失MSEの履歴');
end
%% テストデータを予測で生成
x_test=(-1:0.01:3)';
y_pred=predict(model,x_test);
mse_test=loss(model,x_test,y_pred)
fig3=figure;
func_fig_data2(fig3,x_train,y_train,x_test,y_pred, ...
'学習データと予測データの比較','学習データ','予測データ');
%% 真値との誤差
y_true=func_dim1(x_test);
error=sum((y_pred-y_true).^2)/num_train
%% =================== ローカル関数 ============================ %%
%% 学習データの生成用の関数
function y=func_dim1(x)
y=x.*(x-1).*(x-2);
end
function func_fig_data(fig,x,y,name)
figure(fig);
plot(x,y,'o');
grid on;
xlabel('x');
ylabel('y');
title(name);
drawnow;
end
function func_fig_data2(fig,x1,y1,x2,y2,name,l1,l2)
figure(fig);
plot(x1,y1,'o',x2,y2,'.');
grid on;
xlabel('x');
ylabel('y');
title(name);
legend(l1,l2);
drawnow;
end
function func_fig_semilogy(fig,x,y,lx,ly,name)
figure(fig);
semilogy(x,y);
grid on;
xlabel(lx);
ylabel(ly);
title(name);
drawnow;
end