diff --git a/source/user_guides/howto/training/index.rst b/source/user_guides/howto/training/index.rst index d746a3a8433e1ac7f3e589adea5cacb725be971e..a56dc986fb82eff9ec6f507d75aa0325150ff288 100644 --- a/source/user_guides/howto/training/index.rst +++ b/source/user_guides/howto/training/index.rst @@ -1,6 +1,6 @@ -################################## -使用PaddlePaddle Fluid训练神经网络 -################################## +############ +训练神经网络 +############ PaddlePaddle Fluid支持单机训练,和多节点训练。每种训练模式下,都支持多种训练方法。 diff --git a/source/user_guides/howto/training/save_load_variables.rst b/source/user_guides/howto/training/save_load_variables.rst index e412369bbb52ef412279fc5c7171d548a7c86c89..8d284401023b879c94f66a09cd24e7ecbaba8e6f 100644 --- a/source/user_guides/howto/training/save_load_variables.rst +++ b/source/user_guides/howto/training/save_load_variables.rst @@ -19,7 +19,7 @@ 2. 长期变量 长期变量指的是在整个训练过程中持续存在、不会因为一个迭代的结束而被销毁的变量,例如动态调节的全局学习率等。 - 在PaddlePaddle Fluid中,长期变量通过将 :ref:`api_fluid_Variable` 的 :code:`persistable` + 在PaddlePaddle Fluid中,长期变量通过将 :ref:`api_fluid_Variable` 的 :code:`persistable` 属性设置为 :code:`True` 来表示。所有的模型参数都是长期变量,但并非所有的长期变量都是模型参数。 3. 临时变量 @@ -40,9 +40,9 @@ 因此,根据需求的不同,我们提供了两套API来分别进行模型的参数和checkpoint的保存。 保存模型用于对新样本的预测 -======================== +========================== -如果我们保存模型的目的是用于对新样本的预测,那么只保存模型参数就足够了。我们可以使用 +如果我们保存模型的目的是用于对新样本的预测,那么只保存模型参数就足够了。我们可以使用 :code:`fluid.io.save_params` 接口来进行模型参数的保存。 例如: @@ -56,13 +56,13 @@ prog = fluid.default_main_program() fluid.io.save_params(executor=exe, dirname=param_path, main_program=None) -上面的例子中,通过调用 :code:`fluid.io.save_params` 函数,PaddlePaddle Fluid会对默认 +上面的例子中,通过调用 :code:`fluid.io.save_params` 函数,PaddlePaddle Fluid会对默认 :ref:`api_fluid_Program` 也就是 :code:`prog` 中的所有模型变量进行扫描, 筛选出其中所有的模型参数,并将这些模型参数保存到指定的 :code:`param_path` 之中。 保存checkpoint用于将来恢复训练 -=========================== +============================== 在训练过程中,我们可能希望在一些节点上将当前的训练状态保存下来, 以便在将来需要的时候恢复训练环境继续进行训练。这一般被称作“checkpoint”。 @@ -86,11 +86,11 @@ main_program=prog, max_num_checkpoints=3) -上面的例子中,通过调用 :code:`fluid.io.save_checkpoint` 函数,PaddlePaddle Fluid会对默认 +上面的例子中,通过调用 :code:`fluid.io.save_checkpoint` 函数,PaddlePaddle Fluid会对默认 :ref:`api_fluid_Program` 也就是 :code:`prog` 中的所有模型变量进行扫描, 根据一系列内置的规则自动筛选出其中所有需要保存的变量,并将他们保存到指定的 :code:`path` 目录下。 -:code:`fluid.io.save_checkpoint` 的各个参数中, :code:`trainer_id` 在单机情况下设置为0即可; :code:`trainer_args` +:code:`fluid.io.save_checkpoint` 的各个参数中, :code:`trainer_id` 在单机情况下设置为0即可; :code:`trainer_args` 为一个Python dict,用于给定当前的epoch_id和step_id; :code:`max_num_checkpoints` 用于表示的最大checkpoint数量, 如果目录中已经存在的checkpoint数量超过这个值,那最早的checkpoint将被删除。 @@ -101,16 +101,16 @@ 与模型变量的保存相对应,我们提供了两套API来分别进行模型的参数和checkpoint的载入。 载入模型用于对新样本的预测 -======================== +========================== -对于通过 :code:`fluid.io.save_params` 保存的模型,可以使用 :code:`fluid.io.load_params` +对于通过 :code:`fluid.io.save_params` 保存的模型,可以使用 :code:`fluid.io.load_params` 来进行载入。 例如: .. code-block:: python - import paddle.fluid as fluid + import paddle.fluid as fluid exe = fluid.Executor(fluid.CPUPlace()) param_path = "./my_paddle_model" @@ -118,31 +118,31 @@ fluid.io.load_params(executor=exe, dirname=param_path, main_program=prog) -上面的例子中,通过调用 :code:`fluid.io.load_params` 函数,PaddlePaddle Fluid会对 +上面的例子中,通过调用 :code:`fluid.io.load_params` 函数,PaddlePaddle Fluid会对 :code:`prog` 中的所有模型变量进行扫描,筛选出其中所有的模型参数, 并尝试从 :code:`param_path` 之中读取加载它们。 -需要格外注意的是,这里的 :code:`prog` 必须和调用 :code:`fluid.io.save_params` +需要格外注意的是,这里的 :code:`prog` 必须和调用 :code:`fluid.io.save_params` 时所用的 :code:`prog` 中的前向部分完全一致,且不能包含任何参数更新的操作。如果两者存在不一致, 那么可能会导致一些变量未被正确加载;如果错误地包含了参数更新操作,那可能会导致正常预测过程中参数被更改。 -这两个 :ref:`api_fluid_Program` 之间的关系类似于训练 :ref:`api_fluid_Program` +这两个 :ref:`api_fluid_Program` 之间的关系类似于训练 :ref:`api_fluid_Program` 和测试 :ref:`api_fluid_Program` 之间的关系,详见: :ref:`user_guide_test_while_training`。 -另外,需特别注意运行 :code:`fluid.default_startup_program()` 必须在调用 :code:`fluid.io.load_params` +另外,需特别注意运行 :code:`fluid.default_startup_program()` 必须在调用 :code:`fluid.io.load_params` 之前。如果在之后运行,可能会覆盖已加载的模型参数导致错误。 载入checkpoint用于恢复训练 -=========================== +========================== -对于通过 :code:`fluid.io.save_checkpoint` 保存的模型,可以使用 :code:`fluid.io.load_checkpoint` +对于通过 :code:`fluid.io.save_checkpoint` 保存的模型,可以使用 :code:`fluid.io.load_checkpoint` 来进行载入。 例如: .. code-block:: python - import paddle.fluid as fluid + import paddle.fluid as fluid exe = fluid.Executor(fluid.CPUPlace()) path = "./checkpoints" @@ -150,7 +150,7 @@ fluid.io.load_checkpoint(executor=exe, checkpoint_dir=path, serial=9, main_program=prog) -上面的例子中,通过调用 :code:`fluid.io.save_checkpoint` 函数,PaddlePaddle Fluid会对 +上面的例子中,通过调用 :code:`fluid.io.save_checkpoint` 函数,PaddlePaddle Fluid会对 :code:`prog` 中的所有模型变量进行扫描,根据内置规则自动筛选出需要加载的变量, 并尝试从 :code:`path` 之中读取加载它们。 @@ -158,7 +158,7 @@ 一个checkpoint会被保存在一个子目录中,并在目录名上体现出自己的版本号。 一般越大的版本号表示这个checkpoint越新。 -这里的 :code:`prog` 必须和调用 :code:`fluid.io.save_checkpoint` 时所用的 :code:`prog` +这里的 :code:`prog` 必须和调用 :code:`fluid.io.save_checkpoint` 时所用的 :code:`prog` 完全一致,否则会导致变量加载错误或者未加载。另外,与 :code:`fluid.io.save_params` 类似, -运行 :code:`fluid.default_startup_program()` 也必须在 :code:`fluid.io.load_checkpoint` +运行 :code:`fluid.default_startup_program()` 也必须在 :code:`fluid.io.load_checkpoint` 之前进行。 diff --git a/source/user_guides/howto/training/single_node.rst b/source/user_guides/howto/training/single_node.rst index de5fffa8b76555f09389b4511e7df4b8898cd004..0851969ee648f0afb3989096f32a5c0b905e6ba7 100644 --- a/source/user_guides/howto/training/single_node.rst +++ b/source/user_guides/howto/training/single_node.rst @@ -6,10 +6,10 @@ ######## 要进行PaddlePaddle Fluid单机训练,需要先 :ref:`user_guide_prepare_data` 和 -:ref:`user_guide_config_neural_network` 。当 -:ref:`user_guide_config_neural_network` 完毕后,可以得到两个 +:ref:`user_guide_config_neural_network` 。当\ +:ref:`user_guide_config_neural_network` 完毕后,可以得到两个\ :ref:`api_fluid_Program`, :code:`startup_program` 和 :code:`main_program`。 -默认情况下,可以使用 :ref:`api_fluid_default_startup_program` 与 :ref:`api_fluid_default_main_program` 获得全局的 :ref:`api_fluid_Program`。 +默认情况下,可以使用 :ref:`api_fluid_default_startup_program` 与\ :ref:`api_fluid_default_main_program` 获得全局的 :ref:`api_fluid_Program`。 例如: @@ -34,7 +34,7 @@ # Here the fluid.default_startup_program() and fluid.default_main_program() # has been constructed. -在上述模型配置执行完毕后, :code:`fluid.default_startup_program()` 与 +在上述模型配置执行完毕后, :code:`fluid.default_startup_program()` 与\ :code:`fluid.default_main_program()` 配置完毕了。 初始化参数 @@ -43,7 +43,7 @@ 参数随机初始化 ============== -用户配置完模型后,参数初始化操作会被写入到 +用户配置完模型后,参数初始化操作会被写入到\ :code:`fluid.default_startup_program()` 中。使用 :ref:`api_fluid_Executor` 运行 这一程序,即可在全局 :ref:`api_fluid_Scope` 中随机初始化参数。例如: @@ -52,23 +52,23 @@ exe = fluid.Executor(fluid.CUDAPlace(0)) exe.run(program=fluid.default_startup_program()) -值得注意的是: 如果使用多GPU训练,参数需要先在GPU0上初始化,再经由 +值得注意的是: 如果使用多GPU训练,参数需要先在GPU0上初始化,再经由\ :ref:`api_fluid_ParallelExecutor` 分发到多张显卡上。 载入预定义参数 ============== -在神经网络训练过程中,经常会需要载入预定义模型,进而继续进行训练。 +在神经网络训练过程中,经常会需要载入预定义模型,进而继续进行训练。\ 如何载入预定义参数,请参考 :ref:`user_guide_save_load_vars`。 单卡训练 ######## -执行单卡训练可以使用 :ref:`api_fluid_Executor` 中的 :code:`run()` 方法,运行训练 -:ref:`api_fluid_Program` 即可。在运行的时候,用户可以通过 :code:`run(feed=...)` -参数传入数据;用户可以通过 :code:`run(fetch=...)` 获取持久的数据。例如: +执行单卡训练可以使用 :ref:`api_fluid_Executor` 中的 :code:`run()` 方法,运行训练\ +:ref:`api_fluid_Program` 即可。在运行的时候,用户可以通过 :code:`run(feed=...)`\ +参数传入数据;用户可以通过 :code:`run(fetch=...)` 获取持久的数据。例如:\ .. code-blocks:: python @@ -82,9 +82,9 @@ 这里有几点注意事项: 1. feed的数据格式,请参考文章 :ref:`user_guide_feed_data_to_executor`。 -2. :code:`Executor.run` 的返回值是 :code:`fetch_list=[...]` 的variable值。被fetch - 的Variable必须是persistable的。 :code:`fetch_list` 可以传入Variable的列表, - 也可以传入Varialbe的名字列表。当只Fetch一个对象时,返回值是一个元素。否则, +2. :code:`Executor.run` 的返回值是 :code:`fetch_list=[...]` 的variable值。被fetch\ + 的Variable必须是persistable的。 :code:`fetch_list` 可以传入Variable的列表,\ + 也可以传入Varialbe的名字列表。当只Fetch一个对象时,返回值是一个元素。否则,\ 返回一个列表。 3. 如果需要取回的数据包含序列信息,可以设置 :code:`exe.run(return_numpy=False, ...)` 直接返回 :ref:`api_guide_lod_tensor` @@ -106,8 +106,8 @@ 1. :code:`ParallelExecutor` 的构造函数需要指明要执行的 :ref:`api_fluid_Program` , 并在执行过程中不能修改。 -2. :code:`ParallelExecutor` 需要明确指定是否使用 CUDA 显卡进行训练。在显卡训练 - 模式下会占用全部显卡。用户可以配置 `CUDA_VISIBLE_DEVICES `_ 来修改占用 +2. :code:`ParallelExecutor` 需要明确指定是否使用 CUDA 显卡进行训练。在显卡训练\ + 模式下会占用全部显卡。用户可以配置 `CUDA_VISIBLE_DEVICES `_ 来修改占用\ 的显卡。 进阶使用 diff --git a/source/user_guides/howto/training/test_while_training.rst b/source/user_guides/howto/training/test_while_training.rst index e37227c01cbcd2c715065a17bb8d121a70e4e952..1c6f48b463111fddd02a697cfffc4a9a86c45f5b 100644 --- a/source/user_guides/howto/training/test_while_training.rst +++ b/source/user_guides/howto/training/test_while_training.rst @@ -39,20 +39,20 @@ adam = fluid.optimizer.Adam(learning_rate=0.001) adam.minimize(loss) -在使用 :code:`Optimizer` 之前,将 :code:`fluid.default_main_program()` 复制 -成一个 :code:`test_program` 。之后使用测试数据运行 :code:`test_program`, +在使用 :code:`Optimizer` 之前,将 :code:`fluid.default_main_program()` 复制\ +成一个 :code:`test_program` 。之后使用测试数据运行 :code:`test_program`,\ 就可以做到运行测试程序,而不影响训练结果。 分别配置训练 :ref:`api_fluid_Program` 和测试 :ref:`api_fluid_Program` ===================================================================== 如果训练程序和测试程序相差较大时,用户也可以完全通过定义两个不同的 -:ref:`api_fluid_Program`,分别进行训练和测试。在PaddlePaddle Fluid中, -所有的参数都有名字。如果两个不同的操作,甚至两个不同的网络使用了同样名字的参数, +:ref:`api_fluid_Program`,分别进行训练和测试。在PaddlePaddle Fluid中,\ +所有的参数都有名字。如果两个不同的操作,甚至两个不同的网络使用了同样名字的参数,\ 那么他们的值和内存空间都是共享的。 -PaddlePaddle Fluid中使用 :code:`fluid.unique_name` 包来随机初始化用户未定义的 -参数名称。通过 :code:`fluid.unique_name.guard` 可以确保多次调用某函数 +PaddlePaddle Fluid中使用 :code:`fluid.unique_name` 包来随机初始化用户未定义的\ +参数名称。通过 :code:`fluid.unique_name.guard` 可以确保多次调用某函数\ 参数初始化的名称一致。 例如: