parent
428ce9051c
commit
46d30ec680
@ -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
|
Loading…
Reference in new issue