前提・実現したいこと
python、ニューラルネット初心者です。
python3を用いてニューラルネットを構築しています。
CSVデータに保存した数値データを使って学習を行い、未知のデータに対して10段階の分類を行うことが最終目標です。
未知のデータに対しての予測値がすべて同じ結果になってしまい、解決方法がわからなかったので質問させていただきました。
原因として、予測値の生成部分に間違いがあるのか、学習部分に間違いがあるのか、その解決方法を回答いただけますと幸いです。
また、予測値を出力する別の手法がございましたら教えていただきたいです。
回答にあたって、必要な情報が欠けていましたら補足いたしますので、教えていただけますと幸いです。
発生している問題・エラーメッセージ
[2019.0, 1110.0, 14.05, 17022.0, 726.0, 472.0, 362.0, 860.0, 1863.0, 1247.0, 379.0, 2434.0] --予測値-- [1] [2019.0, 1110.0, 15.05, 16313.0, 810.0, 760.0, 360.0, 2582.0, 1145.0, 695.0, 371.0, 1430.0] --予測値-- [1] .... [2019.0, 1207.0, 14.06666667, 47188.0, 1863.0, 1247.0, 379.0, 2434.0, 3841.0, 2300.0, 468.0, 3228.0] --予測値-- [1] [2019.0, 1207.0, 14.06666667, 16881.0, 1129.0, 438.0, 324.0, 1263.0, 1145.0, 695.0, 371.0, 1430.0] --予測値-- [1] --サンプルチームのデータ-- [1 1 1 1 1 1 1 1 1 1 1 1] --予測値-- [1]
該当のソースコード
python3
1from __future__ import print_function 2import csv 3 4import pandas as pd 5from pandas import Series,DataFrame 6 7from sklearn import svm 8from sklearn.model_selection import train_test_split 9from sklearn.metrics import accuracy_score 10 11import numpy as np 12import matplotlib.pyplot as plt 13 14import tensorflow as tf 15 16from tensorflow import keras 17from tensorflow.keras import models 18from tensorflow.keras import optimizers 19from tensorflow.keras.datasets import fashion_mnist 20from tensorflow.keras import Sequential 21from tensorflow.keras.layers import Dense, Dropout 22from tensorflow.keras.models import Model 23from tensorflow.keras.layers import Input 24 25 26#CSVファイルの読み込み 27data_set = pd.read_csv("NN_testdata_2.csv",sep=",",header=0) 28#説明変数(データセットの入力) 29x = DataFrame(data_set.drop("result",axis=1)) 30 31#目的変数(得点の10段階評価) 32y = DataFrame(data_set["result"]) 33 34#説明変数・目的変数をそれぞれ訓練データ・テストデータに分割 35x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.05) 36 37 38#データの整形 39x_train = x_train.astype(np.float) 40x_test = x_test.astype(np.float) 41 42y_train = tf.keras.utils.to_categorical(y_train,10) 43y_test = tf.keras.utils.to_categorical(y_test,10) 44 45 46#ニューラルネットワークの実装① 47model = tf.keras.Sequential() 48 49model.add(Dense(50, activation='relu', input_shape=(12,))) 50model.add(Dropout(0.2)) 51 52model.add(Dense(50, activation='relu', input_shape=(12,))) 53model.add(Dropout(0.2)) 54 55model.add(Dense(50, activation='relu', input_shape=(12,))) 56model.add(Dropout(0.2)) 57 58model.add(Dense(10, activation='softmax')) 59 60model.summary() 61print("\n") 62 63#ニューラルネットワークの実装② 64model.compile(loss='mean_squared_error',optimizer=tf.keras.optimizers.RMSprop( 65 learning_rate=0.001, rho=0.9, momentum=0.0, epsilon=1e-07, centered=False, 66 name='RMSprop'),metrics=['accuracy']) 67 68#ニューラルネットワークの学習 69history = model.fit(x_train, y_train,batch_size=32,epochs=1000,verbose=1,validation_data=(x_test, y_test)) 70 71#ニューラルネットワークの推論 72score = model.evaluate(x_test,y_test,verbose=1) 73print("\n") 74print("Test loss:",score[0]) 75print("Test accuracy:",score[1]) 76 77#10段階評価したいチームのデータを入力 78f = open('./NN_test_wn2019.csv', 'r') 79reader = csv.reader(f) 80 81#########################################該当箇所########################################### 82for row in reader: 83 line = list(map(float, row)) 84 print(line) 85#予測値の生成 86 if line: 87 sample = np.array([line]) 88 sample = np.reshape(sample,(1,12)) 89 predict=model.predict(sample, batch_size=None, verbose=0, steps=None) 90 classes=np.argmax(predict,axis=1) 91 #classes=(model.predict(sample) > 0.5).astype("int32") 92 print("--予測値--") 93 print(classes) 94 print("\n") 95 else: 96 break 97#################################################################################### 98f.close() 99 100 101 102#偏った入力に対する予測値 103sample = np.array([1,1,1,1,1,1,1,1,1,1,1,1]) 104print("\n") 105print("--サンプルチームのデータ--") 106 107print(sample) 108sample = np.reshape(sample,(1,12)) 109 110predict=model.predict(sample, batch_size=None, verbose=0, steps=None) 111classes=np.argmax(predict,axis=1) 112 113print("\n") 114print("--予測値--") 115print(classes) 116print("\n")
試したこと
入力データを偏ったものにして出力してみましたが、ほかの予測値と同じ結果になってしまいました。
バッチサイズやエポック数を変更してみましたが出力はすべて同じ結果になってしまいました。
(該当箇所内)
predict=model.predict(sample, batch_size=None, verbose=0, steps=None)
classes=np.argmax(predict,axis=1)
↓
classes=(model.predict(sample) > 0.5).astype("int32")
上記の上2列を下の1列に書き換えましたが、出力の予測値はすべて同じ結果になっていました。
予測値は[1]以外にも0-9の間の結果を得ることができましたが、すべて全く同じ出力になっていました。
予測値[3][3][3]...[3][3]
予測値[8][8][8]...[8][8]など
補足情報(FW/ツールのバージョンなど)
python3
tensorflow 2.6.2
keras 2.6.0
回答1件
あなたの回答
tips
プレビュー