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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Python 3.x

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

Python

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

Q&A

解決済

1回答

1375閲覧

ニューラルネットワーク(回帰問題)を組む過程で発生したエラーの解決

prgramnob

総合スコア2

Python 3.x

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

Python

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

0グッド

0クリップ

投稿2021/07/12 06:20

編集2021/07/12 06:56

前提・実現したいこと

ニューラルネットワーク(回帰問題)のプログラムを組んでいる最中にこのようなエラーが出ました。
エラーメッセージがmatmul: Input operand 1 has a mismatch in its core dimension 0, with gufunc signature (n?,k),(k,m?)->(n?,m?) (size 7 is different from 2)
と表示されます。データの規格化は行いました。
解決法が全く分かりません、ご教授お願いします。

発生している問題・エラーメッセージ

ValueError Traceback (most recent call last) <ipython-input-8-51c1fe8543fa> in <module>() 75 x1 = X[i, 0] 76 x2 = X[i, 1] ---> 77 temp = NNreg.predict([[x1, x2]]) 78 Ypred.append(temp) 79 3 frames /usr/local/lib/python3.7/dist-packages/sklearn/neural_network/_multilayer_perceptron.py in predict(self, X) 1331 """ 1332 check_is_fitted(self) -> 1333 y_pred = self._predict(X) 1334 if y_pred.shape[1] == 1: 1335 return y_pred.ravel() /usr/local/lib/python3.7/dist-packages/sklearn/neural_network/_multilayer_perceptron.py in _predict(self, X) 683 layer_units[i + 1]))) 684 # forward propagate --> 685 self._forward_pass(activations) 686 y_pred = activations[-1] 687 /usr/local/lib/python3.7/dist-packages/sklearn/neural_network/_multilayer_perceptron.py in _forward_pass(self, activations) 102 for i in range(self.n_layers_ - 1): 103 activations[i + 1] = safe_sparse_dot(activations[i], --> 104 self.coefs_[i]) 105 activations[i + 1] += self.intercepts_[i] 106 /usr/local/lib/python3.7/dist-packages/sklearn/utils/extmath.py in safe_sparse_dot(a, b, dense_output) 149 ret = np.dot(a, b) 150 else: --> 151 ret = a @ b 152 153 if (sparse.issparse(a) and sparse.issparse(b) ValueError: matmul: Input operand 1 has a mismatch in its core dimension 0, with gufunc signature (n?,k),(k,m?)->(n?,m?) (size 7 is different from 2)

該当のソースコード

python3

1import numpy as np 2import matplotlib.pyplot as plt 3from sklearn.neural_network import MLPClassifier 4from sklearn.neural_network import MLPRegressor 5from sklearn.metrics import mean_squared_error 6 7 8 9data=np.loadtxt("data.csv",delimiter=",",skiprows=1) 10 11a_min = np.round(np.min(data[:, 1]), 3) 12a_max = np.round(np.max(data[:, 1]), 3) 13print("範囲: ", a_min, " 〜 ", a_max) 14data[:, 1] = (data[:,1] - a_min).astype(float) / (a_max - a_min).astype(float) 15print(data[:, 1]) 16 17b_min = np.round(np.min(data[:, 2]), 3) 18b_max = np.round(np.max(data[:, 2]), 3) 19print("範囲: ", b_min, " 〜 ", b_max) 20data[:, 2] = (data[:,2] - b_min).astype(float) / (b_max - b_min).astype(float) 21print(data[:, 2]) 22 23b_min = np.round(np.min(data[:, 3]), 3) 24b_max = np.round(np.max(data[:, 3]), 3) 25print("範囲: ", b_min, " 〜 ", b_max) 26data[:, 3] = (data[:,3] - b_min).astype(float) / (b_max - b_min).astype(float) 27print(data[:, 3]) 28 29b_min = np.round(np.min(data[:, 4]), 3) 30b_max = np.round(np.max(data[:, 4]), 3) 31print("範囲: ", b_min, " 〜 ", b_max) 32data[:, 4] = (data[:,4] - b_min).astype(float) / (b_max - b_min).astype(float) 33print(data[:, 4]) 34 35b_min = np.round(np.min(data[:, 5]), 3) 36b_max = np.round(np.max(data[:, 5]), 3) 37print("範囲: ", b_min, " 〜 ", b_max) 38data[:, 5] = (data[:,5] - b_min).astype(float) / (b_max - b_min).astype(float) 39print(data[:, 5]) 40 41b_min = np.round(np.min(data[:, 6]), 3) 42b_max = np.round(np.max(data[:, 6]), 3) 43print("範囲: ", b_min, " 〜 ", b_max) 44data[:, 6] = (data[:,6] - b_min).astype(float) / (b_max - b_min).astype(float) 45print(data[:, 6]) 46 47b_min = np.round(np.min(data[:, 7]), 3) 48b_max = np.round(np.max(data[:, 7]), 3) 49print("範囲: ", b_min, " 〜 ", b_max) 50data[:, 7] = (data[:,7] - b_min).astype(float) / (b_max - b_min).astype(float) 51print(data[:, 7]) 52 53X = data[:, 1:] 54Y = data[:, 0] 55 56# ニューラルの定義 & 学習 57NNreg = MLPRegressor( 58 hidden_layer_sizes=(5, ), #中間層の次元数 59 max_iter=15000, # 学習回数 60 learning_rate_init=0.001, # 学習係数 61 random_state=0, # 乱数シード 62 verbose=False # 学習過程の可視化 True: 可視化する、False: 可視化しない 63) 64NNreg.fit(X, Y) 65 66loss = NNreg.loss_curve_ 67plt.plot(loss) 68plt.ylabel("Loss") 69plt.xlabel("Iteration") 70plt.grid() 71 72# MSE算出 73Ypred = [] 74for i in range(len(Y)): 75 x1 = X[i, 0] 76 x2 = X[i, 1] 77 temp = NNreg.predict([[x1, x2]]) 78 Ypred.append(temp) 79 80mse = mean_squared_error(Ypred, Y) 81print("MSE: ", mse) 82a = NNreg.predict([[10, 15]]) 83print("予測結果", a) 84

補足情報(FW/ツールのバージョンなど)

google colabを使用してます。

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

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

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

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

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

meg_

2021/07/12 07:21

> データの規格化は行いました。 「規格化」とは何を指していますか?
prgramnob

2021/07/12 07:33

a_min = np.round(np.min(data[:, 1]), 3) a_max = np.round(np.max(data[:, 1]), 3) print("範囲: ", a_min, " 〜 ", a_max) data[:, 1] = (data[:,1] - a_min).astype(float) / (a_max - a_min).astype(float) print(data[:, 1]) b_min = np.round(np.min(data[:, 2]), 3) b_max = np.round(np.max(data[:, 2]), 3) print("範囲: ", b_min, " 〜 ", b_max) data[:, 2] = (data[:,2] - b_min).astype(float) / (b_max - b_min).astype(float) print(data[:, 2]) b_min = np.round(np.min(data[:, 3]), 3) b_max = np.round(np.max(data[:, 3]), 3) print("範囲: ", b_min, " 〜 ", b_max) data[:, 3] = (data[:,3] - b_min).astype(float) / (b_max - b_min).astype(float) print(data[:, 3]) b_min = np.round(np.min(data[:, 4]), 3) b_max = np.round(np.max(data[:, 4]), 3) print("範囲: ", b_min, " 〜 ", b_max) data[:, 4] = (data[:,4] - b_min).astype(float) / (b_max - b_min).astype(float) print(data[:, 4]) b_min = np.round(np.min(data[:, 5]), 3) b_max = np.round(np.max(data[:, 5]), 3) print("範囲: ", b_min, " 〜 ", b_max) data[:, 5] = (data[:,5] - b_min).astype(float) / (b_max - b_min).astype(float) print(data[:, 5]) b_min = np.round(np.min(data[:, 6]), 3) b_max = np.round(np.max(data[:, 6]), 3) print("範囲: ", b_min, " 〜 ", b_max) data[:, 6] = (data[:,6] - b_min).astype(float) / (b_max - b_min).astype(float) print(data[:, 6]) b_min = np.round(np.min(data[:, 7]), 3) b_max = np.round(np.max(data[:, 7]), 3) print("範囲: ", b_min, " 〜 ", b_max) data[:, 7] = (data[:,7] - b_min).astype(float) / (b_max - b_min).astype(float) print(data[:, 7]) のコードで値を0~1にしました。 分析するデータの値を0~1に統一する方が良いと勉強したためです。
meg_

2021/07/12 07:59

一般的に使われる「正規化」のことでしょうか? ※「規格化」とも言うのかもしれませんが知らなかったので確認しました。
guest

回答1

0

ベストアンサー

「# MSE算出」を、学習に使った「X」で行うのなら、下記の通り

python

1Ypred = [] 2for i in range(len(Y)): 3 x1 = X[i, 0] 4 x2 = X[i, 1] 5 temp = NNreg.predict([[x1, x2]]) 6 Ypred.append(temp)

↓ 変更

python

1Ypred = NNreg.predict(X)

 .
学習に使った「X」は、各サンプルに元の「data[:, 1]」〜「data[:, 7]」の7個のデータが入っているのだから、「predict()」での予測の時も、それに合わせる必要があります

python

1a = NNreg.predict([[10, 15]])

は、下記のようにデータ数が7個である必要があります (数値は適当)

python

1a = NNreg.predict([[10, 11, 12, 13, 14, 15, 16]])

投稿2021/07/12 08:20

jbpb0

総合スコア7653

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

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

jbpb0

2021/07/12 08:40 編集

> のコードで値を0~1にしました。 を学習時にやってるなら、 a = NNreg.predict([[10, 11, 12, 13, 14, 15, 16]]) の7個のデータも、それやらないとダメです (上記はやってない) その際に、たとえば一番最初のデータは、 > data[:, 1] = (data[:,1] - a_min).astype(float) / (a_max - a_min).astype(float) と全く同じ処理をする必要があるので、もし学習時とは別の時に予測を行うのなら、「a_min」と「a_max」を後から参照できるように保管しておく必要があります その場合、おそらく、「a_min」と「a_max」は「data[:, 1]」〜「data[:, 7]」で全て異なるでしょうから、それらを全部保管しておく必要があります あるいは、予測時のコードで学習に用いたデータを読み込んで、「data[:, 1]」〜「data[:, 7]」のそれぞれの「a_min」と「a_max」を、予測時にも再計算するか
prgramnob

2021/07/12 09:35

データの保管以外のことについてはすんなり理解できました。データの保管のことについてはピンとこなかったのでもう少し自分で調べて考えてみたいと思います。とても参考になりました。ありがとうございました。
jbpb0

2021/07/12 09:49

たとえば、学習に使ったデータの「data[:, 1]」が、3.0〜12.0の範囲の数値だったとします その場合、 > data[:, 1] = (data[:,1] - a_min).astype(float) / (a_max - a_min).astype(float) によって、 (データ - 3.0) / (12.0 - 3.0) という前処理がされた上で、学習に使われますよね 学習が終わった後の予測でも、同じことをしないといけません たとえば、本当の数値が 10, 11, 12, 13, 14, 15, 16 の場合の予測なら、「data[:, 1]」に相当する「10」は、そのままではなく、 (10 - 3.0) / (12.0 - 3.0) = 0.7777777777777778 に変換してから、「predict()」に入れます 他の数値も、全部同様です 予測時にその変換を行うためには、「3.0」とか「12.0」とかの数値が予測時にも分からないとできませんよね そのために、下記のどちらかを行う必要がある、ということです ・学習に用いたデータを予測時にも読み込んで、minとmaxを再計算して使う ・min, maxの数値を、学習時にどこかのファイルに書き込んでおいて、予測時にはそのファイルからmin, max値を読み込んで使う
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問