質問編集履歴
5
修正しました
title
CHANGED
File without changes
|
body
CHANGED
@@ -99,7 +99,7 @@
|
|
99
99
|
#全結合層誤差
|
100
100
|
Error2 = (t - y) * (1 - y) * y
|
101
101
|
|
102
|
-
a =
|
102
|
+
a = 1e-5
|
103
103
|
#affine層更新
|
104
104
|
w_affine += a * np.dot(z.T, Error2)
|
105
105
|
|
4
コード修正しました
title
CHANGED
File without changes
|
body
CHANGED
@@ -5,9 +5,12 @@
|
|
5
5
|
CNNの構成は、入力→畳み込み層→畳み込み層2→全結合層を想定しています。
|
6
6
|
全結合層から2乗誤差を逆伝搬して誤差逆伝搬を実装しています。
|
7
7
|
|
8
|
-
下のプログラムでは、簡略化のために、入力
|
8
|
+
下のプログラムでは、簡略化のために、入力はnp.arrangeで実装しています。
|
9
9
|
入力はmnistを想定してのこの形となっています。
|
10
10
|
|
11
|
+
学習した結果、テストしたところ、出力の最大の要素が全て同じになってしまい、正しく学習がされていないようです。
|
12
|
+
col2imや逆伝搬の使い方に誤りがあるのでしょうか?
|
13
|
+
|
11
14
|
```python
|
12
15
|
|
13
16
|
import numpy as np
|
@@ -45,14 +48,91 @@
|
|
45
48
|
|
46
49
|
return img[:, :, pad:H + pad, pad:W + pad]
|
47
50
|
|
51
|
+
def f(x):
|
52
|
+
y = 1 / (1 + np.exp(-0.01*x))
|
53
|
+
return y
|
54
|
+
|
55
|
+
#フィルタ
|
56
|
+
#w = np.arange(5*1*9*9).reshape(5,1,9,9)
|
57
|
+
w = np.random.rand(5,1,9,9)/100
|
58
|
+
|
59
|
+
#2層目フィルタ
|
60
|
+
#w2 = np.arange(5*5*9*9).reshape(5,5,9,9)
|
61
|
+
w2 = np.random.rand(5,5,9,9)/100
|
62
|
+
|
63
|
+
#全結合層重み
|
64
|
+
w_affine = np.random.rand(6*6*5,10)/100
|
65
|
+
|
66
|
+
for i in range(1000):#学習回数
|
67
|
+
#入力
|
68
|
+
x = np.arange(6*1*28*28).reshape(6,1,28,28)
|
69
|
+
x = 0.0001*x
|
70
|
+
|
71
|
+
#入力2次元化
|
72
|
+
col_x,out_h,out_w = im2col(x,9,9,1,1,0,0)#入力, フィルタサイズ9, ストライド1
|
73
|
+
|
74
|
+
#1層目フィルタ2次元化
|
75
|
+
col_w = w.reshape(5,-1).T
|
76
|
+
#1層目畳み込み計算
|
77
|
+
conv1_col = np.dot(col_x, col_w)
|
78
|
+
|
79
|
+
#1層目畳み込み層変換
|
80
|
+
conv1 = conv1_col.reshape(x.shape[0], out_h, out_w, -1).transpose(0, 3, 2, 1)
|
81
|
+
|
82
|
+
#2層目フィルタ2次元化
|
83
|
+
col_w2 = w2.reshape(5,-1).T
|
84
|
+
|
85
|
+
#2層目畳み込み計算(2次元)
|
86
|
+
input_col,out_h,out_w = im2col(conv1,9,9,2,2,0,0)#cov1, フィルタサイズ9,ストライド2
|
87
|
+
conv2_col = np.dot(input_col, col_w2)
|
88
|
+
conv2 = conv2_col.reshape(conv1.shape[0], out_h, out_w, -1).transpose(0, 3, 2, 1)
|
89
|
+
|
90
|
+
#全結合層出力
|
91
|
+
z = conv2.reshape(conv2.shape[0],-1)
|
92
|
+
y = f(np.dot(z,w_affine))
|
93
|
+
|
94
|
+
t = np.zeros((6,10))
|
95
|
+
#教師信号
|
96
|
+
for i in range(6):
|
97
|
+
t[i,i]=1
|
98
|
+
|
99
|
+
#全結合層誤差
|
100
|
+
Error2 = (t - y) * (1 - y) * y
|
101
|
+
|
102
|
+
a = -1e-5
|
103
|
+
#affine層更新
|
104
|
+
w_affine += a * np.dot(z.T, Error2)
|
105
|
+
|
106
|
+
#畳み込み層2誤差(1次元)
|
107
|
+
Error1 = np.dot(Error2, w_affine.T)
|
108
|
+
|
109
|
+
#畳み込み層誤差変換
|
110
|
+
dout2 = Error1.reshape(6,5,6,6)
|
111
|
+
dout2 = dout2.transpose(0,2,3,1).reshape(-1,5)
|
112
|
+
|
113
|
+
#w2更新
|
114
|
+
dw2 = np.dot(input_col.T,dout2)
|
115
|
+
dw2 = dw2.transpose(1,0).reshape(5,5,9,9)
|
116
|
+
w2 += a * dw2
|
117
|
+
|
118
|
+
#畳み込み層1誤差
|
119
|
+
dout1_col = np.dot(dout2,col_w2.T)
|
120
|
+
dout1 = col2im(dout1_col,conv1.shape,9,9,2,0)
|
121
|
+
dout1 = dout1.transpose(0,2,3,1).reshape(-1,5)
|
122
|
+
|
123
|
+
#w1更新
|
124
|
+
dw1 = np.dot(col_x.T,dout1)
|
125
|
+
dw1 = dw1.transpose(1,0).reshape(5,1,9,9)
|
126
|
+
w += a * dw1
|
127
|
+
|
128
|
+
#学習結果をテスト
|
48
129
|
#入力
|
49
130
|
x = np.arange(6*1*28*28).reshape(6,1,28,28)
|
50
131
|
x = 0.0001*x
|
51
|
-
print(x)
|
52
132
|
|
53
133
|
#フィルタ
|
54
|
-
w = np.arange(5*1*9*9).reshape(5,1,9,9)
|
134
|
+
#w = np.arange(5*1*9*9).reshape(5,1,9,9)
|
55
|
-
w = 0.01*w
|
135
|
+
#w = 0.01*w
|
56
136
|
|
57
137
|
#入力2次元化
|
58
138
|
col_x,out_h,out_w = im2col(x,9,9,1,1,0,0)#入力, フィルタサイズ9, ストライド1
|
@@ -66,8 +146,8 @@
|
|
66
146
|
conv1 = conv1_col.reshape(x.shape[0], out_h, out_w, -1).transpose(0, 3, 2, 1)
|
67
147
|
|
68
148
|
#2層目フィルタ
|
69
|
-
w2 = np.arange(5*5*9*9).reshape(5,5,9,9)
|
149
|
+
#w2 = np.arange(5*5*9*9).reshape(5,5,9,9)
|
70
|
-
w2 = 0.01*w2
|
150
|
+
#w2 = 0.01*w2
|
71
151
|
|
72
152
|
#2層目フィルタ2次元化
|
73
153
|
col_w2 = w2.reshape(5,-1).T
|
@@ -78,44 +158,14 @@
|
|
78
158
|
conv2 = conv2_col.reshape(conv1.shape[0], out_h, out_w, -1).transpose(0, 3, 2, 1)
|
79
159
|
|
80
160
|
#全結合層重み
|
81
|
-
w_affine = np.random.rand(6*6*5,10)
|
161
|
+
#w_affine = np.random.rand(6*6*5,10)
|
82
162
|
|
83
163
|
#全結合層出力
|
84
164
|
z = conv2.reshape(conv2.shape[0],-1)
|
85
|
-
y = np.dot(z,w_affine)
|
165
|
+
y = f(np.dot(z,w_affine))
|
166
|
+
y_max = np.argmax(y,axis=1)
|
86
167
|
|
87
|
-
t = np.zeros((6,10))
|
88
|
-
#教師信号
|
89
|
-
for i in range(6):
|
90
|
-
|
168
|
+
print(y)
|
169
|
+
print(y_max)
|
91
170
|
print(t)
|
92
|
-
|
93
|
-
#全結合層誤差
|
94
|
-
Error2 = (t-y)
|
95
|
-
|
96
|
-
#affine層更新
|
97
|
-
w_affine += np.dot(z.T, Error2)
|
98
|
-
|
99
|
-
#畳み込み層2誤差(1次元)
|
100
|
-
Error1 = np.dot(Error2, w_affine.T)
|
101
|
-
|
102
|
-
#畳み込み層誤差変換
|
103
|
-
dout2 = Error1.reshape(6,5,6,6)
|
104
|
-
dout2 = dout2.transpose(0,2,3,1).reshape(-1,5)
|
105
|
-
|
106
|
-
#w2更新
|
107
|
-
dw2 = np.dot(input_col.T,dout2)
|
108
|
-
dw2 = dw2.transpose(1,0).reshape(5,5,9,9)
|
109
|
-
w2 += dw2
|
110
|
-
|
111
|
-
#畳み込み層1誤差
|
112
|
-
dout1_col = np.dot(dout2,col_w2.T)
|
113
|
-
dout1 = col2im(dout1_col,conv1.shape,9,9,2,0)
|
114
|
-
dout1 = dout1.transpose(0,2,3,1).reshape(-1,5)
|
115
|
-
|
116
|
-
#w1更新
|
117
|
-
dw1 = np.dot(col_x.T,dout1)
|
118
|
-
dw1 = dw1.transpose(1,0).reshape(5,1,9,9)
|
119
|
-
w += dw1
|
120
|
-
|
121
171
|
```
|
3
コード修正しました
title
CHANGED
File without changes
|
body
CHANGED
@@ -9,6 +9,7 @@
|
|
9
9
|
入力はmnistを想定してのこの形となっています。
|
10
10
|
|
11
11
|
```python
|
12
|
+
|
12
13
|
import numpy as np
|
13
14
|
|
14
15
|
def im2col(input_data, filter_h, filter_w, stride_h=1, stride_w=1, pad_h=0, pad_w=0):
|
@@ -90,8 +91,11 @@
|
|
90
91
|
print(t)
|
91
92
|
|
92
93
|
#全結合層誤差
|
93
|
-
Error2 = (
|
94
|
+
Error2 = (t-y)
|
94
95
|
|
96
|
+
#affine層更新
|
97
|
+
w_affine += np.dot(z.T, Error2)
|
98
|
+
|
95
99
|
#畳み込み層2誤差(1次元)
|
96
100
|
Error1 = np.dot(Error2, w_affine.T)
|
97
101
|
|
2
プログラムを修正しました
title
CHANGED
File without changes
|
body
CHANGED
@@ -46,9 +46,12 @@
|
|
46
46
|
|
47
47
|
#入力
|
48
48
|
x = np.arange(6*1*28*28).reshape(6,1,28,28)
|
49
|
+
x = 0.0001*x
|
50
|
+
print(x)
|
49
51
|
|
50
52
|
#フィルタ
|
51
53
|
w = np.arange(5*1*9*9).reshape(5,1,9,9)
|
54
|
+
w = 0.01*w
|
52
55
|
|
53
56
|
#入力2次元化
|
54
57
|
col_x,out_h,out_w = im2col(x,9,9,1,1,0,0)#入力, フィルタサイズ9, ストライド1
|
@@ -63,6 +66,7 @@
|
|
63
66
|
|
64
67
|
#2層目フィルタ
|
65
68
|
w2 = np.arange(5*5*9*9).reshape(5,5,9,9)
|
69
|
+
w2 = 0.01*w2
|
66
70
|
|
67
71
|
#2層目フィルタ2次元化
|
68
72
|
col_w2 = w2.reshape(5,-1).T
|
@@ -86,11 +90,10 @@
|
|
86
90
|
print(t)
|
87
91
|
|
88
92
|
#全結合層誤差
|
89
|
-
Error2 = (
|
93
|
+
Error2 = (y-t)
|
90
94
|
|
91
95
|
#畳み込み層2誤差(1次元)
|
92
96
|
Error1 = np.dot(Error2, w_affine.T)
|
93
|
-
w_affine += np.dot(z.T, Error2)
|
94
97
|
|
95
98
|
#畳み込み層誤差変換
|
96
99
|
dout2 = Error1.reshape(6,5,6,6)
|
@@ -99,8 +102,7 @@
|
|
99
102
|
#w2更新
|
100
103
|
dw2 = np.dot(input_col.T,dout2)
|
101
104
|
dw2 = dw2.transpose(1,0).reshape(5,5,9,9)
|
102
|
-
w2 +=dw2
|
105
|
+
w2 += dw2
|
103
|
-
print(dw2.shape)
|
104
106
|
|
105
107
|
#畳み込み層1誤差
|
106
108
|
dout1_col = np.dot(dout2,col_w2.T)
|
@@ -110,5 +112,6 @@
|
|
110
112
|
#w1更新
|
111
113
|
dw1 = np.dot(col_x.T,dout1)
|
112
114
|
dw1 = dw1.transpose(1,0).reshape(5,1,9,9)
|
113
|
-
w+=dw1
|
115
|
+
w += dw1
|
116
|
+
|
114
117
|
```
|
1
質問を具体的にしました
title
CHANGED
File without changes
|
body
CHANGED
@@ -1,7 +1,13 @@
|
|
1
1
|
ゼロから作るdeep learningのim2colとcol2im関数のみを用いて, かんたんな畳込みネットワークを作成しようとしているのですが, うまく学習が行えていません。
|
2
|
-
下のプログラムで決定的な誤りが箇所はありますか?
|
2
|
+
下のプログラムで決定的な誤りがある箇所はありますか?
|
3
3
|
学習率と活性化関数とバイアスは考えないでプログラムしています。
|
4
4
|
|
5
|
+
CNNの構成は、入力→畳み込み層→畳み込み層2→全結合層を想定しています。
|
6
|
+
全結合層から2乗誤差を逆伝搬して誤差逆伝搬を実装しています。
|
7
|
+
|
8
|
+
下のプログラムでは、簡略化のために、入力と重みはnp.arrangeで実装しています。
|
9
|
+
入力はmnistを想定してのこの形となっています。
|
10
|
+
|
5
11
|
```python
|
6
12
|
import numpy as np
|
7
13
|
|