单机训练

准备工作

要进行PaddlePaddle Fluid单机训练,需要先 准备数据配置简单的网络 。当配置简单的网络 完毕后,可以得到两个fluid.Programstartup_programmain_program。默认情况下,可以使用 fluid.default_startup_program()fluid.default_main_program() 获得全局的 fluid.Program

例如:

  1. import paddle.fluid as fluid
  2.  
  3. image = fluid.layers.data(name="image", shape=[784])
  4. label = fluid.layers.data(name="label", shape=[1])
  5. hidden = fluid.layers.fc(input=image, size=100, act='relu')
  6. prediction = fluid.layers.fc(input=hidden, size=10, act='softmax')
  7. loss = fluid.layers.mean(
  8. fluid.layers.cross_entropy(
  9. input=prediction,
  10. label=label
  11. )
  12. )
  13.  
  14. sgd = fluid.optimizer.SGD(learning_rate=0.001)
  15. sgd.minimize(loss)
  16.  
  17. # Here the fluid.default_startup_program() and fluid.default_main_program()
  18. # has been constructed.

在上述模型配置执行完毕后, fluid.default_startup_program()fluid.default_main_program() 配置完毕了。

初始化参数

参数随机初始化

用户配置完模型后,参数初始化操作会被写入到fluid.default_startup_program() 中。使用 fluid.Executor() 运行这一程序,即可在全局 fluid.global_scope() 中随机初始化参数。例如:

  1. exe = fluid.Executor(fluid.CUDAPlace(0))
  2. exe.run(program=fluid.default_startup_program())

值得注意的是: 如果使用多GPU训练,参数需要先在GPU0上初始化,再经由fluid.ParallelExecutor 分发到多张显卡上。

载入预定义参数

在神经网络训练过程中,经常会需要载入预定义模型,进而继续进行训练。如何载入预定义参数,请参考 模型/变量的保存、载入与增量训练

单卡训练

执行单卡训练可以使用 fluid.Executor() 中的 run() 方法,运行训练fluid.Program 即可。在运行的时候,用户可以通过 run(feed=…)参数传入数据;用户可以通过 run(fetch=…) 获取持久的数据。例如:

  1. ...
  2. loss = fluid.layers.mean(...)
  3.  
  4. exe = fluid.Executor(...)
  5. # the result is an numpy array
  6. result = exe.run(feed={"image": ..., "label": ...}, fetch_list=[loss])

这里有几点注意事项:

  • feed的数据格式,请参考文章 传递训练数据给执行器
  • Executor.run 的返回值是 fetch_list=[…] 的variable值。被fetch的Variable必须是persistable的。 fetch_list 可以传入Variable的列表,也可以传入Variable的名字列表。Executor.run 返回Fetch结果列表。
  • 如果需要取回的数据包含序列信息,可以设置exe.run(return_numpy=False, …) 直接返回 fluid.LoDTensor。用户可以直接访问 fluid.LoDTensor 中的信息。

多卡训练

执行多卡训练可以使用 fluid.ParallelExecutor 运行训练fluid.Program。例如:

  1. train_exe = fluid.ParallelExecutor(use_cuda=True, loss_name=loss.name,
  2. main_program=fluid.default_main_program())
  3. train_exe.run(fetch_list=[loss.name], feed={...})

这里有几点注意事项:

  • ParallelExecutor 的构造函数需要指明要执行的 fluid.Program ,并在执行过程中不能修改。默认值是 fluid.default_main_program()
  • ParallelExecutor 需要明确指定是否使用 CUDA 显卡进行训练。在显卡训练模式下会占用全部显卡。用户可以配置 CUDA_VISIBLE_DEVICES 来修改占用的显卡。

进阶使用

原文: http://paddlepaddle.org/documentation/docs/zh/1.3/user_guides/howto/training/single_node.html