誤差が減らない
kerasを用いて画像を用いた回帰分析をしています.
以下のコードでは誤差が下がりません.
結果はこんな感じです.
Epoch 84/500
1600/1600 [==============================] - 5s 3ms/step - loss: 14.8227 - val_loss: 5.6889
Epoch 85/500
1600/1600 [==============================] - 5s 3ms/step - loss: 15.6330 - val_loss: 6.1703
Epoch 86/500
1600/1600 [==============================] - 5s 3ms/step - loss: 15.7420 - val_loss: 6.5914
Epoch 87/500
1600/1600 [==============================] - 5s 3ms/step - loss: 15.3729 - val_loss: 3.6529
原因が分かる方は宜しくお願い致します.
今回用いているのは
活性化関数:LeakyReLU
損失関数:相対誤差
#最大応力の値の予測 from keras.models import Sequential from keras.layers import Activation, Dense, Dropout, LeakyReLU #from keras.layers.advanced_activations import LeakyReLU from keras.utils.np_utils import to_categorical from keras.optimizers import Adagrad from keras.optimizers import Adam from keras.models import load_model from keras.callbacks import EarlyStopping, ModelCheckpoint, CSVLogger import numpy as np from PIL import Image import os import time import csv import cv2 import math start_time = time.time() print("開始時刻: " + str(start_time)) #それぞれの画像の枚数を入力 A = 1000 B = 1000 sum =A+B # 学習用のデータを作る. image_list = [] location_list = [] #ハイパーパラメータ #画像サイズ x = 150 y = 75 Z = x*y #入力層のノード数 #エポック数 E = 500 #バッチサイズ BATCH_SIZE = 32 #学習率 LR = 0.00001 #訓練データの数 train=sum train=sum #画像の読み込み:読み込み→リサイズ→1列に変換→正規化 print("画像の読み込み 開始") count=1 for i in range(0,A): im = cv2.imread("data/image/a/"+str(i)+"a.png".format(i),1) #画像の読み込み print(str(i)+"a.png") image = np.array(Image.open("data/image/a/"+str(i)+"a.png").resize((x, y))) #画像をnum配列にしてリサイズ print(image.shape) image =np.reshape(image,Z) #2次元行列を1次元行列に変換 print(image.shape) image_list.append(image / 255.) #appendは追加:1枚ずつ足しこんでいく print(str(count)+"/"+str(train)) count +=1 print('\n') for i in range(0,B): im = cv2.imread("data/image/b/"+str(i)+"b.png".format(i),1) #画像の読み込み print(str(i)+"b.png") image = np.array(Image.open("data/image/b/"+str(i)+"b.png").resize((x, y))) #画像をnum配列にしてリサイズ print(image.shape) image =np.reshape(image,Z) #2次元行列を1次元行列に変換 print(image.shape) image_list.append(image / 255.) #appendは追加:1枚ずつ足しこんでいく print(str(count)+"/"+str(train)) count +=1 print('\n') print("画像の読み込み 終了") # kerasに渡すためにnumpy配列に変換。 image_list = np.array(image_list) #最大応力の位置_読み込み_表示 location = np.loadtxt("data/value/max_stress_value_a.csv",delimiter=",",skiprows=0) location_list.extend(location) location = np.loadtxt("data/value/max_stress_value_b.csv",delimiter=",",skiprows=0) location_list.extend(location) location_list = np.array(location_list) print("\n最大応力の値の行列の形") print(location_list.shape) #print(location_list) np.savetxt("data/value/max_stress_value_true.csv",location_list,delimiter=",") #最大応力の位置_読み込み_終了 # モデルを生成してニューラルネットを構築 model = Sequential() model.add(Dense(8000, input_dim=Z,kernel_initializer='random_uniform',bias_initializer='zeros')) #model.add(Activation("LeakyReLU")) model.add(LeakyReLU()) model.add(Dropout(0.5)) model.add(Dense(100,kernel_initializer='random_uniform',bias_initializer='zeros')) model.add(LeakyReLU()) model.add(Dropout(0.2)) model.add(Dense(50,kernel_initializer='random_uniform',bias_initializer='zeros')) model.add(LeakyReLU()) model.add(Dropout(0.2)) model.add(Dense(10,kernel_initializer='random_uniform',bias_initializer='zeros')) model.add(LeakyReLU()) model.add(Dropout(0.2)) model.add(Dense(1)) model.add(Activation("linear")) # オプティマイザ(最適化)にAdamを使用 opt = Adam(lr=LR) # モデルをコンパイル #最大応力位置の予測 誤差関数:二乗誤差 model.compile(loss="mean_absolute_percentage_error", optimizer=opt) #CSVに各エポックの学習結果の保存 csv_logger = CSVLogger('result/training_process.csv') # 学習を実行。20%はテストに使用 #最大応力位置の予測 モデルフィット history = model.fit(image_list, location_list, nb_epoch=E,verbose=1,callbacks=[csv_logger], batch_size=BATCH_SIZE, validation_split=0.2) #最大応力位置の予測 誤差の評価 loss = model.evaluate(image_list, location_list) #最終の学習結果を書き込む fp = open("result/RESULT.txt","w") fp.write("\nloss:{}".format(loss)) fp.close() #最終の誤差の表示 print("\nloss:{}\n".format(loss)) #予測値 predicted= model.predict(image_list) #print("NNの最大応力の値 予測値") #print(predicted) np.savetxt("result/max_stress_value_predict_result.csv",predicted,delimiter=",") end_time = time.time() print("\n終了時刻: ",end_time) print ("かかった時間: ", (end_time - start_time)) ttime = end_time - start_time fa = open("result/TIME.txt","w") fa.write("\nかかった時間:{} ".format(ttime)) fa.close()
追記
出力層の活性化関数をlinearにしたところ誤差が25%まで下がりましたが,それ以降が下がらないです.
回答1件
あなたの回答
tips
プレビュー