前提・実現したいこと
今回,kerasでのニューラルネットワークを用いた最適化を行ったのですが、正答率が2割とものすごく低いです、、、
どのようにすれば正答率が上がるのでしょうか、、、
層の数や、ニューロンの数などの帰るべき場所のご指摘、消したほうがいい場所や、加えたほうがいいプログラム、またなにかアドバイスなどがあれば教えていただきたいです。
python3にて入力が10ノード、出力がラベリングを行ったもの29個あり、それらを最適化しました。しかし正答率がかなり低く、学習を行っていない状況であり、損失関数に関しても低くない状況です。
学習過程を見ると、損失関数の値が途中から変化せずaccuracyもまったく伸びないです。
したにソースコードは載せさせていただきますが、
現在層の数は4層
ニューロン数は100
オプティマイザーはAdam
学習率は0.01
batch_sizeは32、epochsは10000
データの正規化と、欠損値の確認、除去は済んでおります。
入力と出力のデータ数は約130000個です。
どうかよろしくお願い申し上げます。。。
発生している問題・エラーメッセージ
該当のソースコード
###必要なものをインポート import pandas as pd from pandas import Series,DataFrame from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score import numpy as np import matplotlib.pyplot as plt from keras.models import Sequential from keras.layers import Dense, Dropout from keras.optimizers import Adam import sklearn.preprocessing as sp ###csvファイルからのデータのインポート data = pd.read_csv("動物園.csv",dtype = None,sep=",",header=0) data = data.replace('"', '') ###入力の設定 #zoo以外を切り分ける(10ノード) x = DataFrame(data.drop("zoo",axis=1)) ###出力の設定 #0~28まで"zoo"をラベリング処理 le = sp.LabelEncoder() le.fit(data.zoo.unique()) data.zoo= le.fit_transform(data.zoo) #onehotベクトル化 ohe = sp.OneHotEncoder() enced = ohe.fit_transform(data.zoo.values.reshape(1, -1).transpose()) y = pd.DataFrame(index=data.zoo.index, data=enced.toarray()) ###トレーニングデータと教師データに分ける x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.05) ###モデルの設定 model = Sequential() model.add(Dense(50, activation='relu', input_shape=(10,))) model.add(Dropout(0.2)) model.add(Dense(50, activation='relu', input_shape=(10,))) model.add(Dropout(0.2)) model.add(Dense(50, activation='relu', input_shape=(10,))) model.add(Dropout(0.2)) model.add(Dense(29, activation='softmax')) model.summary() ###オプティマイザー、損失関数を設定 opt = Adam(lr=0.001, decay=1e-6) model.compile(loss='mean_squared_error',optimizer=Adam(lr=0.001, decay=1e-6),metrics=['accuracy']) ###モデルに学習 history = model.fit(x_train, temp_train,batch_size=32,epochs=1000,verbose=1,validation_data=(x_test, temp_test)) score = model.evaluate(x_test,temp_test,verbose=1) print("Test loss:",score[0]) print("Test accuracy:",score[1]) def plot_history(history): # 精度の履歴をプロット plt.plot(history.history['acc']) plt.plot(history.history['val_acc']) plt.title('model accuracy') plt.xlabel('epoch') plt.ylabel('accuracy') plt.legend(['acc', 'val_acc'], loc='lower right') plt.show() # 損失の履歴をプロット plt.plot(history.history['loss']) plt.plot(history.history['val_loss']) plt.title('model loss') plt.xlabel('epoch') plt.ylabel('loss') plt.legend(['loss', 'val_loss'], loc='lower right') plt.show() # 学習履歴をプロット plot_history(history)
試したこと
・データの正規化
・欠損値の削除
・層数やニューロンの数、学習率や関数の変更
・データの重複の確認
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答1件
あなたの回答
tips
プレビュー