"""Convolution Neural Network with batch normalization"""
import sys
import argparse
import minpy
import minpy.numpy as np
import mxnet as mx
from minpy.nn.io import NDArrayIter
# Can also use MXNet IO here
# from mxnet.io import NDArrayIter
from minpy.core import Function
from minpy.nn import layers
from minpy.nn.model import ModelBase
from minpy.nn.solver import Solver
from data_utils import get_CIFAR10_data
# Please uncomment following if you have GPU-enabled MXNet installed.
#from minpy.context import set_context, gpu
#set_context(gpu(0)) # set the global context as gpu(0)
batch_size=128
input_size=(3, 32, 32)
flattened_input_size=3 * 32 * 32
hidden_size=64
num_classes=10
reg = 0.001
nfilter = 32
ks = (5,5)
nepo = 5
learning_rate = 2e-4
bn = True
class ConvolutionNet(ModelBase):
def __init__(self):
super(ConvolutionNet, self).__init__()
# Define symbols that using convolution and max pooling to extract better features
# from input image.
net = mx.sym.Variable(name='X')
net = mx.sym.Convolution(
data=net, name='conv1', kernel=ks, num_filter=nfilter)
net = mx.symbol.BatchNorm(data=net, name='bn1')
net = mx.sym.Activation(
data=net, act_type='relu')
net = mx.sym.Pooling(
data=net, name='pool1', pool_type='max', kernel=(2, 2),
stride=(2, 2))
net = mx.sym.Convolution(
data=net, name='conv2', kernel=ks, num_filter=nfilter)
net = mx.symbol.BatchNorm(data=net, name='bn2')
net = mx.sym.Activation(
data=net, act_type='relu')
net = mx.sym.Pooling(
data=net, name='pool2', pool_type='max', kernel=(2, 2),
stride=(2, 2))
net = mx.sym.Flatten(data=net)
# Create forward function and add parameters to this model.
self.conv = Function(
net, input_shapes={'X': (batch_size,) + input_size},
name='conv')
self.add_params(self.conv.get_params())
# Define ndarray parameters used for classification part.
output_shape = self.conv.get_one_output_shape()
conv_out_size = output_shape[1]
self.add_param(name='w1', shape=(conv_out_size, hidden_size)) \
.add_param(name='b1', shape=(hidden_size,)) \
.add_param(name='w2', shape=(hidden_size, num_classes)) \
.add_param(name='b2', shape=(num_classes,))\
.add_aux_param(name='running_mean', value=None) \
.add_aux_param(name='running_var', value=None)\
.add_param(name='gamma1', shape=(hidden_size,), init_rule='constant', init_config={'value': 1.0}) \
.add_param(name='beta1', shape=(hidden_size,), init_rule='constant')
def forward(self, X, mode):
out = self.conv(X=X, **self.params)
out = layers.affine(out, self.params['w1'], self.params['b1'])
out, self.aux_params['running_mean'], self.aux_params['running_var'] = layers.batchnorm(\
out, self.params['gamma1'], self.params['beta1'], running_mean=self.aux_params['running_mean'],\
running_var=self.aux_params['running_var'])
out = layers.relu(out)
out = layers.affine(out, self.params['w2'], self.params['b2'])
return out
def loss(self, predict, y):
loss_reg = reg
for name, weight in self.params.iteritems():
loss_reg += np.sum(weight**2)
return layers.softmax_loss(predict, y) + 0.5*reg*loss_reg
def main(args):
# Create model.
model = ConvolutionNet()
# Create data iterators for training and testing sets.
data = get_CIFAR10_data(args.data_dir)
train_dataiter = NDArrayIter(data=data['X_train'],
label=data['y_train'],
batch_size=batch_size,
shuffle=True)
test_dataiter = NDArrayIter(data=data['X_test'],
label=data['y_test'],
batch_size=batch_size,
shuffle=False)
# Create solver.
solver = Solver(model,
train_dataiter,
test_dataiter,
num_epochs=nepo,
init_rule='gaussian',
init_config={
'stdvar': 0.001
},
#update_rule='sgd_momentum',
#update_rule='rmsprop',
update_rule ='adam',
optim_config={
'learning_rate': learning_rate
},
verbose=True,
print_every=40)
# Initialize model parameters.
solver.init()
# Train!
solver.train()
if __name__ == '__main__':
parser = argparse.ArgumentParser(description="Multi-layer perceptron example using minpy operators")
parser.add_argument('--data_dir',
type=str,
default='cifar-10-batches-py',
help='Directory that contains cifar10 data')
main(parser.parse_args())
---------------------------------------------------------The code is shown above-----------------------------------------
python demo_cnn_bn.py
Traceback (most recent call last):
File "demo_cnn_bn.py", line 137, in <module>
main(parser.parse_args())
File "demo_cnn_bn.py", line 128, in main
solver.train()
File "/usr/local/lib/python2.7/dist-packages/minpy-0.2.2-py2.7.egg/minpy/nn/solver.py", line 246, in train
self._step(each_batch)
File "/usr/local/lib/python2.7/dist-packages/minpy-0.2.2-py2.7.egg/minpy/nn/solver.py", line 176, in _step
grad_arrays, loss = grad_and_loss_func(*param_arrays)
File "/usr/local/lib/python2.7/dist-packages/minpy-0.2.2-py2.7.egg/minpy/core.py", line 44, in wrapped
result_array = func(*arrays)
File "/usr/local/lib/python2.7/dist-packages/minpy-0.2.2-py2.7.egg/minpy/nn/solver.py", line 170, in loss_func
return self.model.loss_batch(batch, predict)
File "/usr/local/lib/python2.7/dist-packages/minpy-0.2.2-py2.7.egg/minpy/nn/model.py", line 92, in loss_batch
return self.loss(forward_outputs, batch.label[0])
File "demo_cnn_bn.py", line 93, in loss
return layers.softmax_loss(predict, y) + 0.5*reg*loss_reg
File "/usr/local/lib/python2.7/dist-packages/minpy-0.2.2-py2.7.egg/minpy/core.py", line 248, in wrapper
return func(*mpy_args, **mpy_kwargs)
File "/usr/local/lib/python2.7/dist-packages/minpy-0.2.2-py2.7.egg/minpy/nn/layers.py", line 203, in softmax_loss
loss += np.sum(np.log(np.sum(np.exp(probs), axis=1, keepdims=True))) / N
File "/usr/local/lib/python2.7/dist-packages/minpy-0.2.2-py2.7.egg/minpy/dispatch/primitive_selector.py", line 33, in __call__
kwargs)
File "/usr/local/lib/python2.7/dist-packages/minpy-0.2.2-py2.7.egg/minpy/dispatch/policy.py", line 141, in resolve_call
return prim(*args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/minpy-0.2.2-py2.7.egg/minpy/primitive.py", line 208, in __call__
**kwargs_values)
TypeError: _sum_grad() got an unexpected keyword argument 'keepdims'