前提・実現したいこと
現在、三つの入力から一つの値を出力するニューラルネットワーク(回帰問題)をKerasを用いて作成しています。
○具体的なコードの詳細
全データ数:67240(Excelデータにまとめられている)
訓練データ:53792(全データの80%)
テストデータ:13448(全データの20%)
中間層:3個 ●
中間層のニューロン数:15個 ●
出力層:1個
出力層のニューロン数:1個
中間層の活性化関数:sigmoid ●
損失関数:平均二乗誤差(mse)
評価関数:平均絶対誤差(mae)
最適化アルゴリズム:Adam ●
バッチサイズ:1024 ●
エポック数:100 ●
上記のようなネットワークを構成し、●がついている値を何度も変更(AdamをAdagradに、バッチサイズを2048に等)しているのですが、損失が全く減少しません。(1.2→0.98ほどの微小な減少のみ)
ニューラルネットワークを設計した経験がほとんどなく、また調べても回帰問題より分類問題のソースコードが非常に多く困っています。他に以下のコードを変更する余地はありますでしょうか?
発生している問題・エラーメッセージ
損失関数(平均二乗誤差)が減少しない。また平均二乗誤差の評価方法がいまいち把握できていない。(どのくらいの数値まで減少すれば学習が進んでいると言えるのか)
該当のソースコード
%matplotlib inline import tensorflow as tf import openpyxl from sklearn.model_selection import train_test_split import numpy as np import matplotlib.pyplot as plt from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense from tensorflow.keras import optimizers #Excelデータを開く wb = openpyxl.load_workbook('data_for_map.xlsx') #Excelのシートを指定 sheet = wb['parasitic_dataset'] #シート内のセルを指定してリスト化 def get_value_list(s): return([[cell.value for cell in row] for row in s]) sheet_list1 = get_value_list(sheet['A2:C67241']) sheet_list2 = get_value_list(sheet['E2:E67241']) #リストから2次元配列を作成(入力[[t h f]], 出力[[L]]) input_data = np.array(sheet_list1) correct_data = np.array(sheet_list2) n_data = len(input_data) #入力データ, 出力データの標準化 def standardize(x): ave = np.average(x, axis = 0) std = np.std(x, axis = 0) return (x - ave) / std input_data_std = standardize(input_data) correct_data_std = standardize(correct_data) #訓練データを全データの80%, テストデータを全データの20%として分割 input_train, input_test, correct_train, correct_test = train_test_split(input_data_std, correct_data_std, test_size = 0.2, random_state=0) #モデルを構築 model = Sequential() model.add(Dense(15, activation = 'sigmoid', input_shape = (input_train.shape[1],))) model.add(Dense(15, activation = 'sigmoid')) model.add(Dense(15, activation = 'sigmoid')) model.add(Dense(1)) optimizer = tf.keras.optimizers.Adam() model.compile(optimizer = optimizer, loss = 'mean_squared_error', metrics = ['mae']) epoch = 100 #学習を実行 history = model.fit(input_train, correct_train, epochs = epoch, batch_size = 1024, verbose = 1, validation_data = (input_test, correct_test)) #損失をグラフで表示 plt.plot(history.history['loss']) plt.plot(history.history['val_loss']) plt.title('Model loss') plt.ylabel('Loss') plt.xlabel('Epoch') plt.legend(['Train', 'Test'], loc = 'upper left') plt.show() model.summary() #横軸:正解値、縦軸:予測値として分布をプロット(y = x の形状になれば誤差が少ないと判断できる) plt.figure() plt.scatter(correct_train, model.predict(input_train), label = 'Train', c = 'blue') plt.title('Neural Network Predictor') plt.xlabel('Correct') plt.ylabel('Predict') plt.scatter(correct_test, model.predict(input_test), c = 'lightgreen', label = 'Test', alpha = 0.8) plt.legend(loc = 4) plt.show()
試したこと
最適化アルゴリズムの変更
バッチサイズの変更
中間層の数及び中間層のニューロン数の変更
活性化関数の変更
エポック数の変更
補足情報(FW/ツールのバージョンなど)
macOS Big Sur ver11.4
Jupyter Notebook
Python 3.7.11
tensorflow 2.0.0
keras 2.3.1
回答1件
あなたの回答
tips
プレビュー