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

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

新規登録して質問してみよう
ただいま回答率
85.35%
深層学習

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

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

3803閲覧

ニューラルネット、分類問題の予測値の出力がすべて同じになる

hate_tometo

総合スコア3

深層学習

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

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/12/02 17:46

編集2021/12/03 02:15

前提・実現したいこと

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

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

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

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

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

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

jbpb0

2021/12/02 23:04

#10段階評価したいチームのデータを入力 のすぐ上に下記を追加して実行したら、結果はどうなりますでしょうか? predict=model.predict(x_test) classes=np.argmax(predict,axis=1) print(classes)
hate_tometo

2021/12/03 02:17

ご回答ありがとうございます。 上記を追加した際の出力結果ですが、 [1 1 1 1 1 1 1 1 1 1 1 1... 1 1 1 1 1 1 1] すべて1という出力になっていました。
jbpb0

2021/12/03 03:51 編集

コード中の score = model.evaluate(x_test,y_test,verbose=1) print("\n") print("Test loss:",score[0]) print("Test accuracy:",score[1]) の結果は、どうなのでしょうか? 「Test accuracy:」は、それなりの値(1.0に近い)なのですか?
jbpb0

2021/12/03 03:21

CSVファイルからデータを読み込む代わりに、 #CSVファイルの読み込み data_set = pd.read_csv("NN_testdata_2.csv",sep=",",header=0) #説明変数(データセットの入力) x = DataFrame(data_set.drop("result",axis=1)) #目的変数(得点の10段階評価) y = DataFrame(data_set["result"]) ↓ 変更 from sklearn.datasets import load_digits digits = load_digits() x = digits.data y = digits.target と変えて、データ数が横方向に12個ではなく64個なので、それに合わせてネットワークの入力を #ニューラルネットワークの実装① model = tf.keras.Sequential() model.add(Dense(50, activation='relu', input_shape=(12,))) model.add(Dropout(0.2)) ↓ 変更 #ニューラルネットワークの実装① model = tf.keras.Sequential() model.add(Dense(50, activation='relu', input_shape=(64,))) model.add(Dropout(0.2)) と変えて、他は質問に掲載のコードのままで「#10段階評価したいチームのデータを入力」の上まで実行してから、 predict=model.predict(x_test) classes=np.argmax(predict,axis=1) print(classes) print(np.argmax(y_test,axis=1)) を実行して、二つの「print」の結果を比較したら、下記の通りでほぼ同じでした >>> print(classes) [6 2 8 7 1 3 0 6 9 2 8 3 0 4 6 5 1 2 8 1 3 7 3 7 0 5 4 2 8 2 8 1 4 4 2 9 0 7 0 5 5 3 6 3 1 4 8 0 0 1 4 3 6 8 1 6 7 5 6 5 1 0 5 0 7 3 7 3 0 0 4 3 3 2 1 1 4 3 0 6 8 5 7 5 5 0 6 1 4 5] >>> print(np.argmax(y_test,axis=1)) [6 2 8 7 1 3 0 6 9 2 8 3 0 4 6 5 1 2 8 1 3 7 3 7 0 5 4 2 8 2 8 2 4 4 2 9 0 7 0 5 5 3 6 3 2 4 8 0 0 1 4 3 6 8 1 6 7 5 6 5 1 0 5 0 7 3 7 3 0 0 4 3 3 2 1 1 4 3 0 6 5 8 7 5 5 0 6 1 4 5] なので、コードは問題無いと思います 質問者さんの環境でも上記を行なってみてください それで大丈夫なら、質問者さんが学習に使ってるデータで、ちゃんと学習できてるのかを疑った方がいいです history = model.fit(... を実行した時の「acc:」と「val_acc:」は、最終(Epoch 1000/1000)でいくつでしょうか?
hate_tometo

2021/12/03 04:42

ご丁寧な回答ありがとうございます。 ーー質問者さんの環境でも上記を行なってみてください ご指摘の通りの変更をして実行し、二つのprintを比較してみたところ、回答者様と同じような結果が得られましたので、コードに問題はなさそうでした。 ーー「acc:」と「val_acc:」は、最終(Epoch 1000/1000)でいくつでしょうか? 最終的な結果ですが、 Test loss: 0.12964825332164764 Test accuracy: 0.35175880789756775 と、かなり低い結果に終わっています。
jbpb0

2021/12/03 05:33 編集

history = model.fit(... を実行した時に、各Epochで毎回「acc:」と「val_acc:」が表示されますよね それの最終回の数値は、それぞれいくつですか? 【追記】 最終回の「val_acc:」は、たぶん Test accuracy: 0.35175880789756775 と同じです 最終回の「acc:」はいくつでしょうか?
hate_tometo

2021/12/03 05:49

epoch(1000)の時、 acc:0.3489 Test accuracy:0.3467336595058441(val_accと同じ値) となりました。
jbpb0

2021/12/03 06:05 編集

10分類で、正解率35%なので、学習がダメダメですね デタラメ(正解率10%)よりはマシだけど 【追記】 元データの「y」が0~9が偏りなく分布してるなら、推定が全部1とかになったら正解率は約10%になるはずです 悪いながらも正解率が35%になるということは、元データの「y」に偏りがあって1が35%くらいあるのですか?
hate_tometo

2021/12/03 06:07

ご回答ありがとうございます。 お時間をお取りして申し訳ないです、、、 まずは正解率を上げることができるように、方向転換してみます。 丁寧なご回答、解説本当にありがとうございます。
hate_tometo

2021/12/03 06:46 編集

追記ありがとうございます。 正確な数値はわかりませんが、元のデータは実際に、偏っていて、1は特に多いものになっています。 [追記] 計算しましたところ、元のデータ全体の34.88パーセントが1になっていました。
jbpb0

2021/12/03 07:28

> 元のデータ全体の34.88パーセントが1 なら、 > acc:0.3489 Test accuracy:0.3467336595058441(val_accと同じ値) が納得できます 全部1と推定するように学習されたのですね
hate_tometo

2021/12/04 03:00

ご回答ありがとうございます。 データと学習方法についてもう一度見直してみます。 ありがとうございます。
guest

回答1

0

ベストアンサー

python

1#ニューラルネットワークの学習 2history = model.fit(x_train, y_train,batch_size=32,epochs=1000,verbose=1,validation_data=(x_test, y_test))

を実行した時に、各Epochで毎回「acc:」と「val_acc:」が表示されますけど、それの最終回の数値が低すぎるなら、学習がうまくいってません

予測値がすべて同じ結果

となるように学習されてしまったのでしょう

投稿2021/12/03 09:01

jbpb0

総合スコア7653

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問