..  _api_guide_model_save_reader:

#########
模型保存与加载
#########

模型的保存与加载主要涉及到如下八个API：
:code:`fluid.io.save_vars`、:code:`fluid.io.save_params`、:code:`fluid.io.save_persistables`、:code:`fluid.io.save_inference_model`、:code:`fluid.io.load_vars`、:code:`fluid.io.load_params`、:code:`fluid.io.load_persistables` 和 :code:`fluid.io.load_inference_model`。

变量、持久性变量和参数
====================

在 :code:`Paddle` 中，算子(:code:`Operator`)的每一个输入和输出都是一个变量（:code:`Variable`），而参数（:code:`Parameter`）是变量（:code:`Variable`）的子类。持久性变量（:code:`Persistables`）是一种在每次迭代结束后均不会被删除的变量。参数是一种持久性变量，其在每次迭代后都会被优化器（:ref:`api_guide_optimizer`）更新。训练神经网络本质上就是在更新参数。

模型保存API介绍
====================

- :code:`fluid.io.save_vars`：通过执行器（:ref:`api_guide_executor`）保存变量到指定的目录中。保存变量的方式有两种：

  1）通过接口中的 :code:`vars` 指定需要保存的变量列表。

  2）将一个已经存在的程序（:code:`Program`）赋值给接口中的 :code:`main_program`，然后这个程序中的所有变量都将被保存下来。

  第一种保存方式的优先级要高于第二种。

  API Reference 请参考 :ref:`api_fluid_io_save_vars`。

- :code:`fluid.io.save_params`：通过接口中的 :code:`main_program` 指定好程序（:code:`Program`），该接口会将所指定程序中的全部参数（:code:`Parameter`）过滤出来，并将它们保存到 :code:`dirname` 指定的文件夹或 :code:`filename` 指定的文件中。

  API Reference 请参考 :ref:`api_fluid_io_save_params`。

- :code:`fluid.io.save_persistables`：通过接口中的 :code:`main_program` 指定好程序（:code:`Program`），该接口会将所指定程序中的全部持久性变量（:code:`persistable==True`）过滤出来，并将它们保存到 :code:`dirname` 指定的文件夹或 :code:`filename` 指定的文件中。

  API Reference 请参考 :ref:`api_fluid_io_save_persistables`。

- :code:`fluid.io.save_inference_model`：请参考  :ref:`api_guide_inference`。  

模型加载API介绍
====================

- :code:`fluid.io.load_vars`：通过执行器（:code:`Executor`）加载指定目录中的变量。加载变量的方式有两种：
  
  1）通过接口中的 :code:`vars` 指定需要加载的变量列表。
  
  2）将一个已经存在的程序（:code:`Program`）赋值给接口中的 :code:`main_program`，然后这个程序中的所有变量都将被加载。

  第一种加载方式的优先级要高于第二种。

  API Reference 请参考 :ref:`api_fluid_io_load_vars`。

- :code:`fluid.io.load_params`：该接口从 :code:`main_program` 指定的程序中过滤出全部参数（:code:`Parameter`），并试图从 :code:`dirname` 指定的文件夹或 :code:`filename` 指定的文件中加载这些参数。

  API Reference 请参考 :ref:`api_fluid_io_load_params`。

- :code:`fluid.io.load_persistables`：该接口从 :code:`main_program` 指定的程序中过滤出全部持久性变量（:code:`persistable==True`），并试图从 :code:`dirname` 指定的文件夹或 :code:`filename` 指定的文件中加载这些持久性变量。

  API Reference 请参考 :ref:`api_fluid_io_load_persistables`。

-  :code:`fluid.io.load_inference_model`：请参考  :ref:`api_guide_inference`。
