質問編集履歴
3
pythonのコードの個所を追記しました。
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-
|
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-2
|
21
|
+
<ipython-input-12-ec18eea6767d> in forward(self, x)
|
20
|
-
|
22
|
+
49 self.layer0 = x
|
21
|
-
5
|
23
|
+
50 self.layer1 = relu(self.b1+np.dot(x,self.w1))
|
22
|
-
---> 5
|
24
|
+
---> 51 self.layer2 = relu(self.b2+np.dot(x,self.w2))
|
23
|
-
5
|
25
|
+
52 self.layer3 = relu(self.b3+np.dot(x,self.w3))
|
24
|
-
5
|
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
|
-
|
67
|
+
self.b1 = np.zeros(50, dtype=float)
|
49
|
-
|
68
|
+
self.b2 = np.zeros(50, dtype=float)
|
50
|
-
|
69
|
+
self.b3 = np.zeros(10, dtype=float)
|
51
|
-
|
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.
|
77
|
+
第1層 self.layer1: [N, 50]
|
55
|
-
self.
|
78
|
+
第2層 self.layer2: [N, 50]
|
56
|
-
self.w3 = np.random.randn(50, 10) * 0.1
|
57
|
-
self.
|
79
|
+
第3層 self.layer3: [N, 10]
|
80
|
+
出力層 self.out: [N, 1]
|
81
|
+
'''
|
58
82
|
|
59
|
-
|
83
|
+
self.layer0 = x
|
60
|
-
self.
|
84
|
+
self.layer1 = relu(self.b1+np.dot(x,self.w1))
|
61
|
-
self.
|
85
|
+
self.layer2 = relu(self.b2+np.dot(x,self.w2))
|
62
|
-
self.
|
86
|
+
self.layer3 = relu(self.b3+np.dot(x,self.w3))
|
63
|
-
self.
|
87
|
+
self.out = self.b4+np.dot(x,self.w4)
|
88
|
+
return self.out
|
64
89
|
|
65
|
-
def
|
90
|
+
def backward(self, t, y):
|
66
|
-
'''
|
91
|
+
'''
|
67
|
-
|
92
|
+
逆伝播
|
68
|
-
|
93
|
+
真の値 t: [N, 1]
|
94
|
+
予測値 y: [N, 1]
|
95
|
+
|
69
|
-
|
96
|
+
出力層誤差 delta4: [N, 1]
|
97
|
+
第3層誤差 delta3: [N, 10]
|
98
|
+
第2層誤差 delta2: [N, 50]
|
70
|
-
第1層
|
99
|
+
第1層誤差 delta1: [N, 50]
|
100
|
+
|
101
|
+
第4層b勾配 dedb4: [N, 1]
|
102
|
+
第3層b勾配 dedb3: [N, 10]
|
71
|
-
第2層
|
103
|
+
第2層b勾配 dedb2: [N, 50]
|
104
|
+
第1層b勾配 dedb1: [N, 50]
|
105
|
+
|
106
|
+
第4層w勾配 dedw4: [N, 10, 1]
|
72
|
-
第3層
|
107
|
+
第3層w勾配 dedw3: [N, 50, 10]
|
108
|
+
第2層w勾配 dedw2: [N, 50, 50]
|
73
|
-
|
109
|
+
第1層w勾配 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
|
-
|
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
|
-
|
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
|
-
|
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
|
130
|
+
def optimize_GradientDecent(self, lr):
|
85
|
-
'''
|
131
|
+
'''
|
86
|
-
逆伝播
|
87
|
-
|
132
|
+
勾配降下法によるパラメータの更新
|
88
|
-
|
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
最後にモデルの定義が抜けていたので追記しました。
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
記述したコードを追加しました。
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
|
+
|