質問編集履歴

3

pythonのコードの個所を追記しました。

2023/04/30 21:25

投稿

zuken
zuken

スコア1

test CHANGED
File without changes
test CHANGED
@@ -8,20 +8,22 @@
8
8
  Ptthonを使ってコーディングの演習をしています。
9
9
 
10
10
  ### 発生している問題・エラーメッセージ
11
-
11
+ ---------------------------------------------------------------------------
12
12
  ValueError Traceback (most recent call last)
13
- <ipython-input-26-8cec7584f882> in <cell line: 15>()
13
+ <ipython-input-14-8cec7584f882> in <cell line: 15>()
14
+ 16 # 訓練
15
+ 17 # Chapter02範囲外のため、ミニバッチは使用しない
14
16
  ---> 18 y = model.forward(x_train)
15
17
  19 train_loss = MSE(t_train, y)
16
18
  20 model.backward(t_train, y)
17
19
 
18
20
  1 frames
19
- <ipython-input-24-ba7e7fd0f84f> in forward(self, x)
21
+ <ipython-input-12-ec18eea6767d> in forward(self, x)
20
- 51 self.layer0 = x
22
+ 49 self.layer0 = x
21
- 52 self.layer1 = relu(self.b1+np.dot(x,self.w1))
23
+ 50 self.layer1 = relu(self.b1+np.dot(x,self.w1))
22
- ---> 53 self.layer2 = relu(self.b2+np.dot(x,self.w2))
24
+ ---> 51 self.layer2 = relu(self.b2+np.dot(x,self.w2))
23
- 54 self.layer3 = relu(self.b3+np.dot(x,self.w3))
25
+ 52 self.layer3 = relu(self.b3+np.dot(x,self.w3))
24
- 55 self.out = self.b4+np.dot(x,self.w4)
26
+ 53 self.out = self.b4+np.dot(x,self.w4)
25
27
 
26
28
  /usr/local/lib/python3.10/dist-packages/numpy/core/overrides.py in dot(*args, **kwargs)
27
29
 
@@ -29,112 +31,115 @@
29
31
 
30
32
  ### 今回記述しているコードは下記となります。何卒宜しくお願い致します。
31
33
 
34
+ ```python
35
+ # 回帰モデル
32
36
  class MLP_regressor():
33
- '''
37
+ '''
34
- 多層パーセプトロン Multi Layered Perceptron
38
+ 多層パーセプトロン Multi Layered Perceptron
35
- 構成: [入力層, 第1層, 第2層, 第3層, 出力層]
39
+ 構成: [入力層, 第1層, 第2層, 第3層, 出力層]
36
- ノード数: [2, 50, 50, 10, 1]
40
+ ノード数: [2, 50, 50, 10, 1]
37
- '''
41
+ '''
38
42
 
39
- def __init__(self):
43
+ def __init__(self):
40
- '''
44
+ '''
41
- コンストラクタ
45
+ コンストラクタ
42
- パラメータ(重みw, バイアスb)の定義
46
+ パラメータ(重みw, バイアスb)の定義
43
- 第1層重み self.w1: [2, 50] 平均0, 標準偏差0.1の乱数
47
+ 第1層重み self.w1: [2, 50] 平均0, 標準偏差0.1の乱数
44
- 第2層重み self.w2: [50, 50] 平均0, 標準偏差0.1の乱数
48
+ 第2層重み self.w2: [50, 50] 平均0, 標準偏差0.1の乱数
45
- 第3層重み self.w3: [50, 10] 平均0, 標準偏差0.1の乱数
49
+ 第3層重み self.w3: [50, 10] 平均0, 標準偏差0.1の乱数
46
- 第4層重み self.w4: [10, 1] 平均0, 標準偏差0.1の乱数
50
+ 第4層重み self.w4: [10, 1] 平均0, 標準偏差0.1の乱数
51
+
52
+ 第1層バイアス self.b1: [50] 要素が全て0
53
+ 第2層バイアス self.b2: [50] 要素が全て0
54
+ 第3層バイアス self.b3: [10] 要素が全て0
55
+ 第4層バイアス self.b4: [1] 要素が全て0
56
+
57
+ numpyの乱数については以下のページを参照
58
+ https://numpy.org/doc/stable/reference/random/generated/numpy.random.randn.html
59
+ '''
60
+ # 重みの定義
61
+ self.w1 = np.random.randn(2, 50) * 0.1
62
+ self.w2 = np.random.randn(50, 50) * 0.1
63
+ self.w3 = np.random.randn(50, 10) * 0.1
64
+ self.w4 = np.random.randn(10, 1) * 0.1
47
65
 
66
+ # バイアスの定義
48
- 第1層バイアス self.b1: [50] 要素が全て0
67
+ self.b1 = np.zeros(50, dtype=float)
49
- 第2層バイアス self.b2: [50] 要素が全て0
68
+ self.b2 = np.zeros(50, dtype=float)
50
- 第3層バイアス self.b3: [10] 要素が全て0
69
+ self.b3 = np.zeros(10, dtype=float)
51
- 第4層バイアス self.b4: [1] 要素が全て0
70
+ self.b4 = np.zeros(1, dtype=float)
52
71
 
72
+ def forward(self, x):
73
+ '''
74
+ 順伝播
53
- # 重みの定義
75
+ 入力 x: [N, 2]
76
+ 入力層 self.layer0: [N, 2]
54
- self.w1 = np.random.randn(2, 50) * 0.1
77
+ 第1層 self.layer1: [N, 50]
55
- self.w2 = np.random.randn(50, 50) * 0.1
78
+ 第2層 self.layer2: [N, 50]
56
- self.w3 = np.random.randn(50, 10) * 0.1
57
- self.w4 = np.random.randn(10, 1) * 0.1
79
+ 第3層 self.layer3: [N, 10]
80
+ 出力層 self.out: [N, 1]
81
+ '''
58
82
 
59
- # バイアスの定義
83
+ self.layer0 = x
60
- self.b1 = np.zeros(50, dtype=float)
84
+ self.layer1 = relu(self.b1+np.dot(x,self.w1))
61
- self.b2 = np.zeros(50, dtype=float)
85
+ self.layer2 = relu(self.b2+np.dot(x,self.w2))
62
- self.b3 = np.zeros(10, dtype=float)
86
+ self.layer3 = relu(self.b3+np.dot(x,self.w3))
63
- self.b4 = np.zeros(1, dtype=float)
87
+ self.out = self.b4+np.dot(x,self.w4)
88
+ return self.out
64
89
 
65
- def forward(self, x):
90
+ def backward(self, t, y):
66
- '''
91
+ '''
67
- 伝播
92
+ 伝播
68
- 入力 x: [N, 2]
93
+ 真の値 t: [N, 1]
94
+ 予測値 y: [N, 1]
95
+
69
- 力層 self.layer0: [N, 2]
96
+ 力層誤差 delta4: [N, 1]
97
+ 第3層誤差 delta3: [N, 10]
98
+ 第2層誤差 delta2: [N, 50]
70
- 第1層 self.layer1: [N, 50]
99
+ 第1層誤差 delta1: [N, 50]
100
+
101
+ 第4層b勾配 dedb4: [N, 1]
102
+ 第3層b勾配 dedb3: [N, 10]
71
- 第2層 self.layer2: [N, 50]
103
+ 第2層b勾配 dedb2: [N, 50]
104
+ 第1層b勾配 dedb1: [N, 50]
105
+
106
+ 第4層w勾配 dedw4: [N, 10, 1]
72
- 第3層 self.layer3: [N, 10]
107
+ 第3層w勾配 dedw3: [N, 50, 10]
108
+ 第2層w勾配 dedw2: [N, 50, 50]
73
- 出力self.out: [N, 1]
109
+ 第1w勾配 dedw1: [N, 2, 50]
74
- '''
110
+ '''
111
+ # 出力層の誤差デルタは二乗誤差の微分
112
+ delta4= -2 *(t-y)
113
+ # 誤差逆伝播
114
+ delta3 = delta4 * self.w4.t
115
+ delta2 = relu(delta3) * self.w3.t
116
+ delta1 = relu(delta2) * self.w2.t
75
117
 
76
- self.layer0 = x
118
+ # バイアスbのコスト関数eに対する勾配
77
- self.layer1 = relu(self.b1+np.dot(x,self.w1))
78
- self.layer2 = relu(self.b2+np.dot(x,self.w2))
79
- self.layer3 = relu(self.b3+np.dot(x,self.w3))
80
- self.out = self.b4+np.dot(x,self.w4)
119
+ self.dedb4 = np.mean(delta4, axis=0)
120
+ self.dedb3 = np.mean(delta3 * (self.layer3 > 0), axis=0)
121
+ self.dedb2 = np.mean(delta2 * (self.layer2 > 0), axis=0)
122
+ self.dedb1 = np.mean(delta1 * (self.layer1 > 0), axis=0)
81
123
 
82
- return self.out
124
+ # 重みwのコスト関数eに対する勾配
125
+ self.dedw4 = np.dot(self.layer3.T, delta4) / delta4.shape[0]
126
+ self.dedw3 = np.dot(self.layer2.T, delta3 * (self.layer3 > 0)) / delta3.shape[0]
127
+ self.dedw2 = np.dot(self.layer1.T, delta2 * (self.layer2 > 0)) / delta2.shape[0]
128
+ self.dedw1 = np.dot(self.layer0.T, delta1 * (self.layer1 > 0)) / delta1.shape[0]
83
129
 
84
- def backward(self, t, y):
130
+ def optimize_GradientDecent(self, lr):
85
- '''
131
+ '''
86
- 逆伝播
87
- 真の値 t: [N, 1]
132
+ 勾配降下法によるパラメータの更新
88
- 予測値 y: [N, 1]
133
+ '''
134
+ self.b1 -= lr * self.dedb1
135
+ self.b2 -= lr * self.dedb2
136
+ self.b3 -= lr * self.dedb3
137
+ self.b4 -= lr * self.dedb4
89
138
 
90
- 出力層誤差 delta4: [N, 1]
91
- 第3層誤差 delta3: [N, 10]
92
- 第2層誤差 delta2: [N, 50]
93
- 第1層誤差 delta1: [N, 50]
94
-
95
- 第4層b勾配 dedb4: [N, 1]
96
- 第3層b勾配 dedb3: [N, 10]
97
- 第2層b勾配 dedb2: [N, 50]
98
- 第1層b勾配 dedb1: [N, 50]
99
-
100
- 第4層w勾配 dedw4: [N, 10, 1]
101
- 第3層w勾配 dedw3: [N, 50, 10]
102
- 第2層w勾配 dedw2: [N, 50, 50]
103
- 第1層w勾配 dedw1: [N, 2, 50]
104
- '''
105
-
106
- # 出力層の誤差デルタは二乗誤差の微分
107
- delta4= -2 *(t-y)
108
- # 誤差逆伝播
109
- delta3 = delta4 * self.w4.t
110
- delta2 = relu(delta3) * self.w3.t
111
- delta1 = relu(delta2) * self.w2.t
112
-
113
- # バイアスbのコスト関数eに対する勾配
114
- self.dedb4 = np.mean(delta4, axis=0)
115
- self.dedb3 = np.mean(delta3 * (self.layer3 > 0), axis=0)
116
- self.dedb2 = np.mean(delta2 * (self.layer2 > 0), axis=0)
117
- self.dedb1 = np.mean(delta1 * (self.layer1 > 0), axis=0)
118
-
119
- # 重みwのコスト関数eに対する勾配
120
- self.dedw4 = np.dot(self.layer3.T, delta4) / delta4.shape[0]
121
- self.dedw3 = np.dot(self.layer2.T, delta3 * (self.layer3 > 0)) / delta3.shape[0]
122
- self.dedw2 = np.dot(self.layer1.T, delta2 * (self.layer2 > 0)) / delta2.shape[0]
123
- self.dedw1 = np.dot(self.layer0.T, delta1 * (self.layer1 > 0)) / delta1.shape[0]
124
-
125
- def optimize_GradientDecent(self, lr):
126
- '''
127
- 勾配降下法によるパラメータの更新
128
- '''
129
- self.b1 -= lr * self.dedb1
130
- self.b2 -= lr * self.dedb2
131
- self.b3 -= lr * self.dedb3
132
- self.b4 -= lr * self.dedb4
133
-
134
- self.w1 -= lr * self.dedw1
139
+ self.w1 -= lr * self.dedw1
135
- self.w2 -= lr * self.dedw2
140
+ self.w2 -= lr * self.dedw2
136
- self.w3 -= lr * self.dedw3
141
+ self.w3 -= lr * self.dedw3
137
- self.w4 -= lr * self.dedw4
142
+ self.w4 -= lr * self.dedw4
138
143
 
139
144
  # モデルの定義
140
145
  model = MLP_regressor()
@@ -164,4 +169,5 @@
164
169
  print('EPOCH ', n + 1, ' | TRAIN LOSS ',
165
170
  train_loss, ' | TEST LOSS ', test_loss)
166
171
  regression_loss = test_loss
172
+ ```
167
173
 

2

最後にモデルの定義が抜けていたので追記しました。

2023/04/29 22:13

投稿

zuken
zuken

スコア1

test CHANGED
File without changes
test CHANGED
@@ -136,3 +136,32 @@
136
136
  self.w3 -= lr * self.dedw3
137
137
  self.w4 -= lr * self.dedw4
138
138
 
139
+ # モデルの定義
140
+ model = MLP_regressor()
141
+
142
+ # 学習率
143
+ lr = 0.01
144
+ # 学習エポック数
145
+ n_epoch = 500
146
+
147
+ x_train = train_data[:, 0:2]
148
+ t_train = train_data[:, 2:3]
149
+ x_test = test_data[:, 0:2]
150
+ t_test = test_data[:, 2:3]
151
+
152
+ # n_epoch繰り返す
153
+ for n in range(n_epoch):
154
+ # 訓練
155
+ y = model.forward(x_train)
156
+ train_loss = MSE(t_train, y)
157
+ model.backward(t_train, y)
158
+ model.optimize_GradientDecent(lr)
159
+
160
+ # テスト
161
+ y = model.forward(x_test)
162
+ test_loss = MSE(t_test, y)
163
+
164
+ print('EPOCH ', n + 1, ' | TRAIN LOSS ',
165
+ train_loss, ' | TEST LOSS ', test_loss)
166
+ regression_loss = test_loss
167
+

1

記述したコードを追加しました。

2023/04/29 21:35

投稿

zuken
zuken

スコア1

test CHANGED
File without changes
test CHANGED
@@ -27,3 +27,112 @@
27
27
 
28
28
  ValueError: shapes (10000,2) and (50,50) not aligned: 2 (dim 1) != 50 (dim 0)
29
29
 
30
+ ### 今回記述しているコードは下記となります。何卒宜しくお願い致します。
31
+
32
+ class MLP_regressor():
33
+ '''
34
+ 多層パーセプトロン Multi Layered Perceptron
35
+ 構成: [入力層, 第1層, 第2層, 第3層, 出力層]
36
+ ノード数: [2, 50, 50, 10, 1]
37
+ '''
38
+
39
+ def __init__(self):
40
+ '''
41
+ コンストラクタ
42
+ パラメータ(重みw, バイアスb)の定義
43
+ 第1層重み self.w1: [2, 50] 平均0, 標準偏差0.1の乱数
44
+ 第2層重み self.w2: [50, 50] 平均0, 標準偏差0.1の乱数
45
+ 第3層重み self.w3: [50, 10] 平均0, 標準偏差0.1の乱数
46
+ 第4層重み self.w4: [10, 1] 平均0, 標準偏差0.1の乱数
47
+
48
+ 第1層バイアス self.b1: [50] 要素が全て0
49
+ 第2層バイアス self.b2: [50] 要素が全て0
50
+ 第3層バイアス self.b3: [10] 要素が全て0
51
+ 第4層バイアス self.b4: [1] 要素が全て0
52
+
53
+ # 重みの定義
54
+ self.w1 = np.random.randn(2, 50) * 0.1
55
+ self.w2 = np.random.randn(50, 50) * 0.1
56
+ self.w3 = np.random.randn(50, 10) * 0.1
57
+ self.w4 = np.random.randn(10, 1) * 0.1
58
+
59
+ # バイアスの定義
60
+ self.b1 = np.zeros(50, dtype=float)
61
+ self.b2 = np.zeros(50, dtype=float)
62
+ self.b3 = np.zeros(10, dtype=float)
63
+ self.b4 = np.zeros(1, dtype=float)
64
+
65
+ def forward(self, x):
66
+ '''
67
+ 順伝播
68
+ 入力 x: [N, 2]
69
+ 入力層 self.layer0: [N, 2]
70
+ 第1層 self.layer1: [N, 50]
71
+ 第2層 self.layer2: [N, 50]
72
+ 第3層 self.layer3: [N, 10]
73
+ 出力層 self.out: [N, 1]
74
+ '''
75
+
76
+ self.layer0 = x
77
+ self.layer1 = relu(self.b1+np.dot(x,self.w1))
78
+ self.layer2 = relu(self.b2+np.dot(x,self.w2))
79
+ self.layer3 = relu(self.b3+np.dot(x,self.w3))
80
+ self.out = self.b4+np.dot(x,self.w4)
81
+
82
+ return self.out
83
+
84
+ def backward(self, t, y):
85
+ '''
86
+ 逆伝播
87
+ 真の値 t: [N, 1]
88
+ 予測値 y: [N, 1]
89
+
90
+ 出力層誤差 delta4: [N, 1]
91
+ 第3層誤差 delta3: [N, 10]
92
+ 第2層誤差 delta2: [N, 50]
93
+ 第1層誤差 delta1: [N, 50]
94
+
95
+ 第4層b勾配 dedb4: [N, 1]
96
+ 第3層b勾配 dedb3: [N, 10]
97
+ 第2層b勾配 dedb2: [N, 50]
98
+ 第1層b勾配 dedb1: [N, 50]
99
+
100
+ 第4層w勾配 dedw4: [N, 10, 1]
101
+ 第3層w勾配 dedw3: [N, 50, 10]
102
+ 第2層w勾配 dedw2: [N, 50, 50]
103
+ 第1層w勾配 dedw1: [N, 2, 50]
104
+ '''
105
+
106
+ # 出力層の誤差デルタは二乗誤差の微分
107
+ delta4= -2 *(t-y)
108
+ # 誤差逆伝播
109
+ delta3 = delta4 * self.w4.t
110
+ delta2 = relu(delta3) * self.w3.t
111
+ delta1 = relu(delta2) * self.w2.t
112
+
113
+ # バイアスbのコスト関数eに対する勾配
114
+ self.dedb4 = np.mean(delta4, axis=0)
115
+ self.dedb3 = np.mean(delta3 * (self.layer3 > 0), axis=0)
116
+ self.dedb2 = np.mean(delta2 * (self.layer2 > 0), axis=0)
117
+ self.dedb1 = np.mean(delta1 * (self.layer1 > 0), axis=0)
118
+
119
+ # 重みwのコスト関数eに対する勾配
120
+ self.dedw4 = np.dot(self.layer3.T, delta4) / delta4.shape[0]
121
+ self.dedw3 = np.dot(self.layer2.T, delta3 * (self.layer3 > 0)) / delta3.shape[0]
122
+ self.dedw2 = np.dot(self.layer1.T, delta2 * (self.layer2 > 0)) / delta2.shape[0]
123
+ self.dedw1 = np.dot(self.layer0.T, delta1 * (self.layer1 > 0)) / delta1.shape[0]
124
+
125
+ def optimize_GradientDecent(self, lr):
126
+ '''
127
+ 勾配降下法によるパラメータの更新
128
+ '''
129
+ self.b1 -= lr * self.dedb1
130
+ self.b2 -= lr * self.dedb2
131
+ self.b3 -= lr * self.dedb3
132
+ self.b4 -= lr * self.dedb4
133
+
134
+ self.w1 -= lr * self.dedw1
135
+ self.w2 -= lr * self.dedw2
136
+ self.w3 -= lr * self.dedw3
137
+ self.w4 -= lr * self.dedw4
138
+