Skip to content

Commit 2c9cf59

Browse files
committed
use OrderedDict
1 parent c03ca7c commit 2c9cf59

File tree

1 file changed

+27
-25
lines changed

1 file changed

+27
-25
lines changed

ch07/simple_convnet.py

Lines changed: 27 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -24,37 +24,42 @@ class SimpleConvNet:
2424
'sigmoid'または'xavier'を指定した場合は「Xavierの初期値」を設定
2525
"""
2626
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},
2828
hidden_size=100, output_size=10, weight_init_std=0.01):
2929
filter_num = conv_param['filter_num']
3030
filter_size = conv_param['filter_size']
3131
filter_pad = conv_param['pad']
3232
filter_stride = conv_param['stride']
3333
input_size = input_dim[1]
3434
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))
3536

3637
# 重みの初期化
3738
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)
3941
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)
4144
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)
4347
self.params['b3'] = np.zeros(output_size)
4448

4549
# レイヤの生成
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+
5459
self.last_layer = SoftmaxWithLoss()
5560

5661
def predict(self, x):
57-
for layer in self.layers:
62+
for layer in self.layers.values():
5863
x = layer.forward(x)
5964

6065
return x
@@ -124,19 +129,16 @@ def gradient(self, x, t):
124129
dout = 1
125130
dout = self.last_layer.backward(dout)
126131

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:
130135
dout = layer.backward(dout)
131136

132137
# 設定
133138
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
140142

141143
return grads
142144

@@ -153,6 +155,6 @@ def load_params(self, file_name="params.pkl"):
153155
for key, val in params.items():
154156
self.params[key] = val
155157

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

Comments
 (0)