質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

最適化

最適化とはメソッドやデザインの最適な処理方法を選択することです。パフォーマンスの向上を目指す為に行われます。プログラミングにおける最適化は、アルゴリズムのスピードアップや、要求されるリソースを減らすことなどを指します。

Q&A

解決済

1回答

1395閲覧

kerasでのニューラルネットワークを用いた正答率の向上をしたいです

退会済みユーザー

退会済みユーザー

総合スコア0

Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

最適化

最適化とはメソッドやデザインの最適な処理方法を選択することです。パフォーマンスの向上を目指す為に行われます。プログラミングにおける最適化は、アルゴリズムのスピードアップや、要求されるリソースを減らすことなどを指します。

0グッド

2クリップ

投稿2019/08/28 07:02

前提・実現したいこと

今回,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/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tiitoi

2019/08/28 07:28 編集

モデルをどう作成するか、前処理をどうするかはデータ次第です。 データをどこかにアップしていただけないと、どのようにすれば精度を上げられるかは申し上げられません。
guest

回答1

0

ベストアンサー

お疲れさまです。いくつか列記します。

1.モデルについて

python

1model = Sequential() 2model.add(Dense(50, activation='relu', input_shape=(10,))) 3model.add(Dropout(0.2)) 4model.add(Dense(50, activation='relu', input_shape=(10,))) 5...

の箇所について、input_shape=(10,)は最初の一度のみで十分かと思われます。
(つまり、こういう感じでは無いでしょうか?)

python

1model = Sequential() 2model.add(Dense(50, activation='relu', input_shape=(10,))) 3model.add(Dropout(0.2)) 4model.add(Dense(50, activation='relu')) 5...

このためモデルの表現力が下がっているのでは無いかと思いました。

https://qiita.com/ash8h/items/29e24fc617b832fba136
https://keras.io/ja/getting-started/sequential-model-guide/#shape

2.データの確認・特徴量エンジニアリング
モデルに入力されるデータが本当に意図した通りか確認すると、個人的にはヒントがよく見つかります。
良い特徴量が見つかるかもしれません。
https://qiita.com/katsu1110/items/a1c3185fec39e5629bcb

有効な特徴量がつくれれば、データを増やさなくても性能が上がります。
https://upura.hatenablog.com/entry/2019/02/22/221125

3.ハイパーパラメータ探索用のツールの使用
良いハイパラが見つかると性能は上がります
https://qiita.com/wataoka/items/f46224ccccc5321543bd
https://www.hellocybernetics.tech/entry/2018/12/22/160349

4.他のモデルの使用
ニューラルネットワークの使用にこだわりが無く、精度を上げることが目的であれば、他のモデルをいくつか試してみることをおすすめします。
https://towardsdatascience.com/catboost-vs-light-gbm-vs-xgboost-5f93620723db

投稿2019/09/02 07:27

m3yrin

総合スコア132

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問