From 46d30ec680f494e4cc30a73330074497da064fbd Mon Sep 17 00:00:00 2001 From: qiaolongfei Date: Thu, 17 Aug 2017 20:34:02 -0700 Subject: [PATCH] init minst.py --- python/paddle/v2/framework/tests/mnist.py | 140 ++++++++++++++++++++++ 1 file changed, 140 insertions(+) create mode 100644 python/paddle/v2/framework/tests/mnist.py diff --git a/python/paddle/v2/framework/tests/mnist.py b/python/paddle/v2/framework/tests/mnist.py new file mode 100644 index 000000000..32a088ac2 --- /dev/null +++ b/python/paddle/v2/framework/tests/mnist.py @@ -0,0 +1,140 @@ +import paddle.v2.framework.core as core +from paddle.v2.framework.op import Operator +import numpy + +BATCH_SIZE = 100 + +scope = core.Scope() +place = core.CPUPlace() +dev_ctx = core.DeviceContext.create(place) + +# init_net = core.Net.create() +forward_network = core.Net.create() + +# should be init after forward_op is constructed +# backward_net = core.Operator.backward(forward_net, set()) +backward_net = None +optimize_net = core.Net.create() + + +def atom_id(): + id = 0 + while True: + yield id + id += 1 + + +uniq_id = atom_id().next + + +def data_layer(name, dims): + var = scope.new_var(name) + tensor = var.get_tensor() + tensor.set_dims(dims) # 1 is batch size holder. + return name + + +def feed_data(name, data): + assert isinstance(data, numpy.array) + tensor = scope.find_var(name).get_tensor() + tensor.set_dims(data.shape) + tensor.alloc_float(place) + tensor.set(data, place) + + +def grad_var_name(var_name): + return var_name + "@GRAD" + + +def sgd_optimizer(net, param_name, learning_rate=0.01): + grad_name = grad_var_name(param_name) + optimize_op = Operator( + "sgd", param=param_name, grad=grad_name, learning_rate=learning_rate) + net.add_op(optimize_op) + + +# should use operator and add these to the init_network +def init_param(param_name, dims): + print param_name + var = scope.new_var(param_name) + tensor = var.get_tensor() + tensor.set_dims(dims) + data = numpy.random.uniform( + low=0.0, high=1.0, size=tensor.shape()).astype("float32") + tensor.set(data, place) + + +# fc_layer +def fc_layer(net, input, size, act="sigmoid", bias=True, param=None, name=None): + """ + Add a fc layer to net + + :param input: input variable name. + :type input: str + :param size: fully connected layer size. + :param act: activation name + :param param: parameter attribute, used for initialize parameters. + :param bias: bias attribute. False will not have a bias. + :param name: the name of fc layer. If not set, model will generate a + readable name + :return: output variable name. + """ + if name is None: + name = 'fc_%d' % uniq_id() + if not isinstance(name, str): + raise ValueError("name should be string") + + input_dims = scope.find_var(input).get_tensor().get_dims() + + w_name = param or name + ".w" + init_param(param_name=w_name, dims=[input_dims[1], size]) + sgd_optimizer(net=optimize_net, param_name=w_name, learning_rate=0.01) + + pre_activation = name + ".mul.out" + scope.new_var(pre_activation) + mul_op = Operator("mul", X=input, Y=w_name, Out=pre_activation) + net.add_op(mul_op) + + # create bias variable if needed + if bias: + bias_name = name + ".b" + init_param(param_name=bias_name, dims=[size]) + sgd_optimizer( + net=optimize_net, param_name=bias_name, learning_rate=0.01) + bias_out = name + ".rowwise_add.out" + scope.new_var(bias_out) + rowwise_add_op = Operator( + "rowwise_add", X=pre_activation, b=bias_name, Out=bias_out) + net.add_op(rowwise_add_op) + pre_activation = bias_out + + activation_op = Operator(act, X=pre_activation, Y=name) + net.add_op(activation_op) + scope.new_var(name) + net.infer_shape(scope) + return name + + +def cross_entropy_layer(net, input, label): + cost_name = 'cross_entropy_%d' % uniq_id() + cross_entropy_op = Operator( + "onehot_cross_entropy", X=input, label=label, Y=cost_name) + net.add_op(cross_entropy_op) + scope.new_var(cost_name) + net.infer_shape(scope) + return cost_name + + +images = data_layer(name='pixel', dims=[BATCH_SIZE, 784]) +label = data_layer(name='label', dims=[BATCH_SIZE]) +fc = fc_layer(net=forward_network, input=images, size=10, act="softmax") +cost = cross_entropy_layer(net=forward_network, input=fc, label=label) +forward_network.complete_add_op(True) +print(forward_network) +backward_net = core.Operator.backward(forward_network, set()) + +print(backward_net) + +PASS_NUM = 10 +for pass_id in range(PASS_NUM): + print pass_id -- GitLab