提交 46d30ec6 编写于 作者: Q qiaolongfei

init minst.py

上级 428ce905
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
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册