美文网首页
Paddle 1.6 快速上手

Paddle 1.6 快速上手

作者: 臻甄 | 来源:发表于2020-04-03 15:55 被阅读0次

Paddle在1.7.0以后就都是动态图操作了,稳定性还不好说,毕竟TF2.0居然都存在内存泄露这样的大bug。

因此快速上手主要是paddle 1.6系列,是静态图中最后的一个版本。

安装

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple paddlepaddle==1.6.3

快速上手

  • 导入paddle的fluid包,设置全局变量
$ python
>>> import paddle.fluid as fluid    # 导入
>>> place = fluid.CPUPlace()   # 定义CPU环境
>>> exe = fluid.Executor(place)   # 创建执行器
  • 创建tensor
>>> tensor = fluid.layers.ones(shape=[5], dtype='int64')  # 定义Tensor向量
>>> tensor
name: "fill_constant_0.tmp_0"
type {
  type: LOD_TENSOR
  lod_tensor {
    tensor {
      data_type: INT64
      dims: 5
    }
  }
}
persistable: false

>>> data = exe.run(fluid.default_main_program(), fetch_list=[data])  # 执行器run一下就可以取出数据
>>> data
[array([1, 1, 1, 1, 1], dtype=int64)]
>>> type(data)
<class 'list'>
>>> type(data[0])   # 默认是numpy数据
<class 'numpy.ndarray'>
  • tensor相加(按位)
>>> tensor1 = fluid.layers.ones([5], 'int64')
>>> tensor2 = fluid.layers.ones([5], 'int64')
>>> sum = fluid.layers.elementwise_add(tensor1, tensor2)
>>> result = exe.run(fluid.default_main_program(), fetch_list=[sum])
>>> result
[array([2, 2, 2, 2, 2], dtype=int64)]
  • tensor转换数据类型
>>> tensor = fluid.layers.ones([5], 'int64')
>>> f_tensor = fluid.layers.cast(tensor, 'float64')  # 转换数据类型
>>> tensor
name: "fill_constant_0.tmp_0"
type {
  type: LOD_TENSOR
  lod_tensor {
    tensor {
      data_type: INT64
      dims: 5
    }
  }
}
persistable: false

>>> f_tensor
name: "cast_0.tmp_0"
type {
  type: LOD_TENSOR
  lod_tensor {
    tensor {
      data_type: FP64
      dims: 5
    }
    lod_level: 0
  }
}
persistable: false

>>> exe.run(fluid.default_main_program(), fetch_list=[tensor, f_tensor])
[array([1, 1, 1, 1, 1], dtype=int64), array([1., 1., 1., 1., 1.])]

常用OP

op:operator操作算子,比如上一节中的castones都算。
paddle常用的op很多都在fluid.layers

  • fluid.layers.data:定义tensor变量
  • fluid.layers.square_error_cost:求两个batch数据的平方差
  • fluid.layers.mean:求batch的均值
  • fluid.optimizer.SGD:优化器,类似的还有Adam等

更常见的接口见:TensorFlow-Fluid常用接口对应表

短小精悍的程序来展示paddle如何完成一次训练,拟合四元一次方程的值。

# coding: utf-8
#加载库
import paddle.fluid as fluid
import numpy as np

#生成数据
np.random.seed(0) # 固定随机种子,方便复现
outputs = np.random.randint(low=0, high=5, size=(10, 4))  # 10个 a, b, c, d 参数
res = []
for i in range(10):
    # 假设方程式为 y = 4a + 6b + 7c + 2d
    y = 4*outputs[i][0] + 6*outputs[i][1] + 7*outputs[i][2] + 2*outputs[i][3]
    res.append([y])

# 定义数据 输入数据和label
train_data=np.array(outputs).astype('float32')
y_true = np.array(res).astype('float32')

#定义网络
x = fluid.layers.data(name="x",shape=[4],dtype='float32') # x 变量
y = fluid.layers.data(name="y",shape=[1],dtype='float32') # y 变量
y_predict = fluid.layers.fc(input=x,size=1,act=None)

#定义损失函数
cost = fluid.layers.square_error_cost(input=y_predict,label=y)
avg_cost = fluid.layers.mean(cost)

#定义优化方法
sgd_optimizer = fluid.optimizer.SGD(learning_rate=0.05)
sgd_optimizer.minimize(avg_cost)

#参数初始化
cpu = fluid.CPUPlace()
exe = fluid.Executor(cpu)
exe.run(fluid.default_startup_program())

##############################################
#开始训练,迭代500次
for i in range(500):
    outs = exe.run(feed={'x':train_data,'y':y_true},
                   fetch_list=[y_predict.name,avg_cost.name])
    if i%50==0:
        print ('iter={:.0f}, cost={}'.format(i,outs[1][0]))
#存储训练结果
params_dirname = "result"
fluid.io.save_inference_model(dirname=params_dirname, 
                              feeded_var_names=['x'],  # 需要输入的变量名称
                              target_vars=[y_predict], 
                              executor=exe)

##############################################
# 开始预测
infer_exe = fluid.Executor(cpu)
inference_scope = fluid.Scope()
# 加载训练好的模型
with fluid.scope_guard(inference_scope):
    [inference_program, feed_target_names, fetch_targets] = \
        fluid.io.load_inference_model(dirname=params_dirname, 
                                      executor=infer_exe)
print("feed_target_names: {}".format(feed_target_names)) # 打印输入变量的名称

# 生成测试数据
test = np.array([[[9],[5],[2],[10]]]).astype('float32')
# 进行预测
results = infer_exe.run(inference_program,
                        feed={"x": test},
                        fetch_list=fetch_targets)
# 给出题目为 【9,5,2,10】 输出y=4*9+6*5+7*2+10*2的值
print ("inference: 9a + 5b + 2c + 10d = {}".format(results[0][0]))

运行程序,自动完成(1)生成数据(2)定义网络(3)训练保存(4)加载预测 的流程。

$ python start.py
iter=0, cost=1305.5911865234375
iter=50, cost=0.13385649025440216
iter=100, cost=0.05532369762659073
iter=150, cost=0.022923115640878677
iter=200, cost=0.009497975930571556
iter=250, cost=0.003935434389859438
iter=300, cost=0.0016306063625961542
iter=350, cost=0.0006756152724847198
iter=400, cost=0.00027995515847578645
iter=450, cost=0.00011598169658100232
feed_target_names: ['x']
inference: 9a + 5b + 2c + 10d = [99.94348]

$ ls
result   start.py

$ ls result
__model__ fc_0.b_0  fc_0.w_0

Paddle API分类

详细见:Paddle API文档

Paddle API

相关文章

网友评论

      本文标题:Paddle 1.6 快速上手

      本文链接:https://www.haomeiwen.com/subject/cauxphtx.html