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

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

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

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

Q&A

解決済

2回答

959閲覧

定義した多層パーセプトロンを使用し、データを学習するコーディングを実施する中でエラーが発生して行き詰ってます。

zuken

総合スコア1

Python 3.x

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

0グッド

0クリップ

投稿2023/04/28 21:44

編集2023/04/30 21:25

実現したいこと

ここに実現したいことを箇条書きで書いてください。

  • [1 ] エラーを解消し、学習を成功させたい。
  • [ 2] エラーの内容を理解したい。

前提

Ptthonを使ってコーディングの演習をしています。

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


ValueError Traceback (most recent call last)
<ipython-input-14-8cec7584f882> in <cell line: 15>()
16 # 訓練
17 # Chapter02範囲外のため、ミニバッチは使用しない
---> 18 y = model.forward(x_train)
19 train_loss = MSE(t_train, y)
20 model.backward(t_train, y)

1 frames
<ipython-input-12-ec18eea6767d> in forward(self, x)
49 self.layer0 = x
50 self.layer1 = relu(self.b1+np.dot(x,self.w1))
---> 51 self.layer2 = relu(self.b2+np.dot(x,self.w2))
52 self.layer3 = relu(self.b3+np.dot(x,self.w3))
53 self.out = self.b4+np.dot(x,self.w4)

/usr/local/lib/python3.10/dist-packages/numpy/core/overrides.py in dot(*args, **kwargs)

ValueError: shapes (10000,2) and (50,50) not aligned: 2 (dim 1) != 50 (dim 0)

今回記述しているコードは下記となります。何卒宜しくお願い致します。

python

1# 回帰モデル 2class MLP_regressor(): 3 ''' 4 多層パーセプトロン Multi Layered Perceptron 5 構成: [入力層, 第1層, 第2層, 第3層, 出力層] 6 ノード数: [2, 50, 50, 10, 1] 7 ''' 8 9 def __init__(self): 10 ''' 11 コンストラクタ 12 パラメータ(重みw, バイアスb)の定義 13 第1層重み self.w1: [2, 50] 平均0, 標準偏差0.1の乱数 14 第2層重み self.w2: [50, 50] 平均0, 標準偏差0.1の乱数 15 第3層重み self.w3: [50, 10] 平均0, 標準偏差0.1の乱数 16 第4層重み self.w4: [10, 1] 平均0, 標準偏差0.1の乱数 17 18 第1層バイアス self.b1: [50] 要素が全て0 19 第2層バイアス self.b2: [50] 要素が全て0 20 第3層バイアス self.b3: [10] 要素が全て0 21 第4層バイアス self.b4: [1] 要素が全て0 22 23 numpyの乱数については以下のページを参照 24 https://numpy.org/doc/stable/reference/random/generated/numpy.random.randn.html 25 ''' 26 # 重みの定義 27 self.w1 = np.random.randn(2, 50) * 0.1 28 self.w2 = np.random.randn(50, 50) * 0.1 29 self.w3 = np.random.randn(50, 10) * 0.1 30 self.w4 = np.random.randn(10, 1) * 0.1 31 32 # バイアスの定義 33 self.b1 = np.zeros(50, dtype=float) 34 self.b2 = np.zeros(50, dtype=float) 35 self.b3 = np.zeros(10, dtype=float) 36 self.b4 = np.zeros(1, dtype=float) 37 38 def forward(self, x): 39 ''' 40 順伝播 41 入力 x: [N, 2] 42 入力層 self.layer0: [N, 2] 43 第1層 self.layer1: [N, 50] 44 第2層 self.layer2: [N, 50] 45 第3層 self.layer3: [N, 10] 46 出力層 self.out: [N, 1] 47 ''' 48 49 self.layer0 = x 50 self.layer1 = relu(self.b1+np.dot(x,self.w1)) 51 self.layer2 = relu(self.b2+np.dot(x,self.w2)) 52 self.layer3 = relu(self.b3+np.dot(x,self.w3)) 53 self.out = self.b4+np.dot(x,self.w4) 54 return self.out 55 56 def backward(self, t, y): 57 ''' 58 逆伝播 59 真の値 t: [N, 1] 60 予測値 y: [N, 1] 61 62 出力層誤差 delta4: [N, 1] 63 第3層誤差 delta3: [N, 10] 64 第2層誤差 delta2: [N, 50] 65 第1層誤差 delta1: [N, 50] 66 67 第4層b勾配 dedb4: [N, 1] 68 第3層b勾配 dedb3: [N, 10] 69 第2層b勾配 dedb2: [N, 50] 70 第1層b勾配 dedb1: [N, 50] 71 72 第4層w勾配 dedw4: [N, 10, 1] 73 第3層w勾配 dedw3: [N, 50, 10] 74 第2層w勾配 dedw2: [N, 50, 50] 75 第1層w勾配 dedw1: [N, 2, 50] 76 ''' 77 # 出力層の誤差デルタは二乗誤差の微分 78 delta4= -2 *(t-y) 79 # 誤差逆伝播 80 delta3 = delta4 * self.w4.t 81 delta2 = relu(delta3) * self.w3.t 82 delta1 = relu(delta2) * self.w2.t 83 84 # バイアスbのコスト関数eに対する勾配 85 self.dedb4 = np.mean(delta4, axis=0) 86 self.dedb3 = np.mean(delta3 * (self.layer3 > 0), axis=0) 87 self.dedb2 = np.mean(delta2 * (self.layer2 > 0), axis=0) 88 self.dedb1 = np.mean(delta1 * (self.layer1 > 0), axis=0) 89 90 # 重みwのコスト関数eに対する勾配 91 self.dedw4 = np.dot(self.layer3.T, delta4) / delta4.shape[0] 92 self.dedw3 = np.dot(self.layer2.T, delta3 * (self.layer3 > 0)) / delta3.shape[0] 93 self.dedw2 = np.dot(self.layer1.T, delta2 * (self.layer2 > 0)) / delta2.shape[0] 94 self.dedw1 = np.dot(self.layer0.T, delta1 * (self.layer1 > 0)) / delta1.shape[0] 95 96 def optimize_GradientDecent(self, lr): 97 ''' 98 勾配降下法によるパラメータの更新 99 ''' 100 self.b1 -= lr * self.dedb1 101 self.b2 -= lr * self.dedb2 102 self.b3 -= lr * self.dedb3 103 self.b4 -= lr * self.dedb4 104 105 self.w1 -= lr * self.dedw1 106 self.w2 -= lr * self.dedw2 107 self.w3 -= lr * self.dedw3 108 self.w4 -= lr * self.dedw4 109 110# モデルの定義 111model = MLP_regressor() 112 113# 学習率 114lr = 0.01 115# 学習エポック数 116n_epoch = 500 117 118x_train = train_data[:, 0:2] 119t_train = train_data[:, 2:3] 120x_test = test_data[:, 0:2] 121t_test = test_data[:, 2:3] 122 123# n_epoch繰り返す 124for n in range(n_epoch): 125 # 訓練 126 y = model.forward(x_train) 127 train_loss = MSE(t_train, y) 128 model.backward(t_train, y) 129 model.optimize_GradientDecent(lr) 130 131 # テスト 132 y = model.forward(x_test) 133 test_loss = MSE(t_test, y) 134 135 print('EPOCH ', n + 1, ' | TRAIN LOSS ', 136 train_loss, ' | TEST LOSS ', test_loss) 137regression_loss = test_loss

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

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

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

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

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

jbpb0

2023/04/28 23:38

他人が現象を再現できるように、質問にコードを載せた方が、回答されやすくなると思いますよ
meg_

2023/04/29 00:26

> [ 2] エラーの内容を理解したい。 エラーは下記で発生しているようなので、さらに下記引数の計算のどこで発生しているのか?を調べると良いのでは? > ---> 53 self.layer2 = relu(self.b2+np.dot(x,self.w2))
zuken

2023/04/29 09:51

ご指摘ありがとうございます。 今回のコードは下記となります。何卒宜しくお願い致します。 class MLP_regressor(): ''' 多層パーセプトロン Multi Layered Perceptron 構成: [入力層, 第1層, 第2層, 第3層, 出力層] ノード数: [2, 50, 50, 10, 1] ''' def __init__(self): ''' コンストラクタ パラメータ(重みw, バイアスb)の定義 第1層重み self.w1: [2, 50] 平均0, 標準偏差0.1の乱数 第2層重み self.w2: [50, 50] 平均0, 標準偏差0.1の乱数 第3層重み self.w3: [50, 10] 平均0, 標準偏差0.1の乱数 第4層重み self.w4: [10, 1] 平均0, 標準偏差0.1の乱数 第1層バイアス self.b1: [50] 要素が全て0 第2層バイアス self.b2: [50] 要素が全て0 第3層バイアス self.b3: [10] 要素が全て0 第4層バイアス self.b4: [1] 要素が全て0 # 重みの定義 self.w1 = np.random.randn(2, 50) * 0.1 self.w2 = np.random.randn(50, 50) * 0.1 self.w3 = np.random.randn(50, 10) * 0.1 self.w4 = np.random.randn(10, 1) * 0.1 # バイアスの定義 self.b1 = np.zeros(50, dtype=float) self.b2 = np.zeros(50, dtype=float) self.b3 = np.zeros(10, dtype=float) self.b4 = np.zeros(1, dtype=float) def forward(self, x): ''' 順伝播 入力 x: [N, 2] 入力層 self.layer0: [N, 2] 第1層 self.layer1: [N, 50] 第2層 self.layer2: [N, 50] 第3層 self.layer3: [N, 10] 出力層 self.out: [N, 1] ''' self.layer0 = x self.layer1 = relu(self.b1+np.dot(x,self.w1)) self.layer2 = relu(self.b2+np.dot(x,self.w2)) self.layer3 = relu(self.b3+np.dot(x,self.w3)) self.out = self.b4+np.dot(x,self.w4) return self.out def backward(self, t, y): ''' 逆伝播 真の値 t: [N, 1] 予測値 y: [N, 1] 出力層誤差 delta4: [N, 1] 第3層誤差 delta3: [N, 10] 第2層誤差 delta2: [N, 50] 第1層誤差 delta1: [N, 50] 第4層b勾配 dedb4: [N, 1] 第3層b勾配 dedb3: [N, 10] 第2層b勾配 dedb2: [N, 50] 第1層b勾配 dedb1: [N, 50] 第4層w勾配 dedw4: [N, 10, 1] 第3層w勾配 dedw3: [N, 50, 10] 第2層w勾配 dedw2: [N, 50, 50] 第1層w勾配 dedw1: [N, 2, 50] ''' # 出力層の誤差デルタは二乗誤差の微分 delta4= -2 *(t-y) # 誤差逆伝播 delta3 = delta4 * self.w4.t delta2 = relu(delta3) * self.w3.t delta1 = relu(delta2) * self.w2.t # バイアスbのコスト関数eに対する勾配 self.dedb4 = np.mean(delta4, axis=0) self.dedb3 = np.mean(delta3 * (self.layer3 > 0), axis=0) self.dedb2 = np.mean(delta2 * (self.layer2 > 0), axis=0) self.dedb1 = np.mean(delta1 * (self.layer1 > 0), axis=0) # 重みwのコスト関数eに対する勾配 self.dedw4 = np.dot(self.layer3.T, delta4) / delta4.shape[0] self.dedw3 = np.dot(self.layer2.T, delta3 * (self.layer3 > 0)) / delta3.shape[0] self.dedw2 = np.dot(self.layer1.T, delta2 * (self.layer2 > 0)) / delta2.shape[0] self.dedw1 = np.dot(self.layer0.T, delta1 * (self.layer1 > 0)) / delta1.shape[0] def optimize_GradientDecent(self, lr): ''' 勾配降下法によるパラメータの更新 ''' self.b1 -= lr * self.dedb1 self.b2 -= lr * self.dedb2 self.b3 -= lr * self.dedb3 self.b4 -= lr * self.dedb4 self.w1 -= lr * self.dedw1 self.w2 -= lr * self.dedw2 self.w3 -= lr * self.dedw3 self.w4 -= lr * self.dedw4
jbpb0

2023/04/29 12:19

コードは、質問を編集して追記してください
zuken

2023/04/29 22:05

ありがとうございます。質問を編集しました。
meg_

2023/04/30 01:04

コードはインデントが判るように記入いただがないと非常に読みにくいです。(第三者が読む気にならないです) https://teratail.com/help/question-tips の「3-5. あなたが何をしたかを書きましょう」の「ソースコードを書きましょう」アドバイス の箇所等を参考にMarkdownで記入しましょう。
jbpb0

2023/04/30 09:49

pythonのコードの一番最初の行のすぐ上に ```python だけの行を追加してください また、pythonのコードの一番最後の行のすぐ下に ``` だけの行を追加してください または、 https://teratail.storage.googleapis.com/uploads/contributed_images/56957fe805d9d7befa7dba6a98676d2b.gif を見て、そのようにしてみてください 現状、コードがとても読み辛いです 質問にコードを載せる際に上記をやってくれたら、他人がコードを読みやすくなり、コードの実行による現象確認もやりやすくなるので、回答されやすくなります
zuken

2023/04/30 21:26

ご指摘いただきありがとうございます。コードの個所追加してみました。お手数おかけしますがご確認お願いします。
guest

回答2

0

/usr/local/lib/python3.10/dist-packages/numpy/core/overrides.py in dot(*args, **kwargs)

ValueError: shapes (10000,2) and (50,50) not aligned: 2 (dim 1) != 50 (dim 0)

上記エラーメッセージよりnumpy.dot()でエラーが発生していて今回のコードでは行列乗算をしているようですね。numpy.dot

w2np.random.randn(50, 50) * 0.1で作成されているようなので、x.shape(10, 50)などの列数が50のデータでないとエラーが発生するでしょう。

書籍などを参考に質問のコードを書かれている場合には、転記ミスがないか確認しましょう。
今回の場合は入力データが間違っているか、重みの定義が間違っている可能性があるかと思います。

投稿2023/04/30 01:21

meg_

総合スコア10631

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

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

0

自己解決

50行~のnp.dotの引数をself.layer*に変更したところ解決しました。お騒がせしてすみません。

python

1 self.layer0 = x 2 self.layer1 = relu(self.b1+np.dot(self.layer0,self.w1)) 3 self.layer2 = relu(self.b2 + np.dot(self.layer1, self.w2)) 4 self.layer3 = relu(self.b3+np.dot(self.layer2,self.w3)) 5 self.out = self.b4+np.dot(self.layer3,self.w4)

投稿2023/05/02 22:51

zuken

総合スコア1

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.42%

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

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

質問する

関連した質問