@@ -24,37 +24,42 @@ class SimpleConvNet:
24
24
'sigmoid'または'xavier'を指定した場合は「Xavierの初期値」を設定
25
25
"""
26
26
def __init__ (self , input_dim = (1 , 28 , 28 ),
27
- conv_param = {'filter_num' :30 , 'filter_size' :5 , 'pad' :0 , 'stride' :1 },
27
+ conv_param = {'filter_num' :30 , 'filter_size' :5 , 'pad' :0 , 'stride' :1 },
28
28
hidden_size = 100 , output_size = 10 , weight_init_std = 0.01 ):
29
29
filter_num = conv_param ['filter_num' ]
30
30
filter_size = conv_param ['filter_size' ]
31
31
filter_pad = conv_param ['pad' ]
32
32
filter_stride = conv_param ['stride' ]
33
33
input_size = input_dim [1 ]
34
34
conv_output_size = (input_size - filter_size + 2 * filter_pad ) / filter_stride + 1
35
+ pool_output_size = int (filter_num * (conv_output_size / 2 ) * (conv_output_size / 2 ))
35
36
36
37
# 重みの初期化
37
38
self .params = {}
38
- self .params ['W1' ] = weight_init_std * np .random .randn (filter_num , input_dim [0 ], filter_size , filter_size )
39
+ self .params ['W1' ] = weight_init_std * \
40
+ np .random .randn (filter_num , input_dim [0 ], filter_size , filter_size )
39
41
self .params ['b1' ] = np .zeros (filter_num )
40
- self .params ['W2' ] = weight_init_std * np .random .randn (int (filter_num * (conv_output_size / 2 )* (conv_output_size / 2 )), hidden_size )
42
+ self .params ['W2' ] = weight_init_std * \
43
+ np .random .randn (pool_output_size , hidden_size )
41
44
self .params ['b2' ] = np .zeros (hidden_size )
42
- self .params ['W3' ] = weight_init_std * np .random .randn (hidden_size , output_size )
45
+ self .params ['W3' ] = weight_init_std * \
46
+ np .random .randn (hidden_size , output_size )
43
47
self .params ['b3' ] = np .zeros (output_size )
44
48
45
49
# レイヤの生成
46
- self .layers = []
47
- self .layers .append (Convolution (self .params ['W1' ], self .params ['b1' ], conv_param ['stride' ], conv_param ['pad' ]))
48
- self .layers .append (Relu ())
49
- self .layers .append (Pooling (pool_h = 2 , pool_w = 2 , stride = 2 ))
50
- self .layers .append (Affine (self .params ['W2' ], self .params ['b2' ]))
51
- self .layers .append (Relu ())
52
- self .layers .append (Affine (self .params ['W3' ], self .params ['b3' ]))
53
-
50
+ self .layers = OrderedDict ()
51
+ self .layers ['Conv1' ] = Convolution (self .params ['W1' ], self .params ['b1' ],
52
+ conv_param ['stride' ], conv_param ['pad' ])
53
+ self .layers ['Relu1' ] = Relu ()
54
+ self .layers ['Pool1' ] = Pooling (pool_h = 2 , pool_w = 2 , stride = 2 )
55
+ self .layers ['Affine1' ] = Affine (self .params ['W2' ], self .params ['b2' ])
56
+ self .layers ['Relu2' ] = Relu ()
57
+ self .layers ['Affine2' ] = Affine (self .params ['W3' ], self .params ['b3' ])
58
+
54
59
self .last_layer = SoftmaxWithLoss ()
55
60
56
61
def predict (self , x ):
57
- for layer in self .layers :
62
+ for layer in self .layers . values () :
58
63
x = layer .forward (x )
59
64
60
65
return x
@@ -124,19 +129,16 @@ def gradient(self, x, t):
124
129
dout = 1
125
130
dout = self .last_layer .backward (dout )
126
131
127
- tmp_layers = self .layers .copy ( )
128
- tmp_layers .reverse ()
129
- for layer in tmp_layers :
132
+ layers = list ( self .layers .values () )
133
+ layers .reverse ()
134
+ for layer in layers :
130
135
dout = layer .backward (dout )
131
136
132
137
# 設定
133
138
grads = {}
134
- grads ['W1' ] = self .layers [0 ].dW
135
- grads ['b1' ] = self .layers [0 ].db
136
- grads ['W2' ] = self .layers [3 ].dW
137
- grads ['b2' ] = self .layers [3 ].db
138
- grads ['W3' ] = self .layers [5 ].dW
139
- grads ['b3' ] = self .layers [5 ].db
139
+ grads ['W1' ], grads ['b1' ] = self .layers ['Conv1' ].dW , self .layers ['Conv1' ].db
140
+ grads ['W2' ], grads ['b2' ] = self .layers ['Affine1' ].dW , self .layers ['Affine1' ].db
141
+ grads ['W3' ], grads ['b3' ] = self .layers ['Affine2' ].dW , self .layers ['Affine2' ].db
140
142
141
143
return grads
142
144
@@ -153,6 +155,6 @@ def load_params(self, file_name="params.pkl"):
153
155
for key , val in params .items ():
154
156
self .params [key ] = val
155
157
156
- for i , layer_idx in enumerate (( 0 , 3 , 5 ) ):
157
- self .layers [layer_idx ]. w = self .params ['W' + str (i + 1 )]
158
- self .layers [layer_idx ].b = self .params ['b' + str (i + 1 )]
158
+ for i , key in enumerate ([ 'Conv1' , 'Affine1' , 'Affine2' ] ):
159
+ self .layers [key ]. W = self .params ['W' + str (i + 1 )]
160
+ self .layers [key ].b = self .params ['b' + str (i + 1 )]
0 commit comments