実現したいこと
ここに実現したいことを箇条書きで書いてください。
- [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
回答2件
あなたの回答
tips
プレビュー