teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

5

修正しました

2021/01/04 04:32

投稿

redcatML
redcatML

スコア26

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 = -1e-5
102
+ a = 1e-5
103
103
  #affine層更新
104
104
  w_affine += a * np.dot(z.T, Error2)
105
105
 

4

コード修正しました

2021/01/04 04:32

投稿

redcatML
redcatML

スコア26

title CHANGED
File without changes
body CHANGED
@@ -5,9 +5,12 @@
5
5
  CNNの構成は、入力→畳み込み層→畳み込み層2→全結合層を想定しています。
6
6
  全結合層から2乗誤差を逆伝搬して誤差逆伝搬を実装しています。
7
7
 
8
- 下のプログラムでは、簡略化のために、入力と重みはnp.arrangeで実装しています。
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
- t[i,i]=1
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

コード修正しました

2021/01/04 04:24

投稿

redcatML
redcatML

スコア26

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 = (y-t)
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

プログラムを修正しました

2021/01/04 03:45

投稿

redcatML
redcatML

スコア26

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 = (t-y)
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

質問を具体的にしました

2021/01/04 03:40

投稿

redcatML
redcatML

スコア26

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