io_cn.rst 32.6 KB
Newer Older
T
Tink_Y 已提交
1 2 3 4 5 6 7 8 9
#################
 fluid.io
#################



.. _cn_api_fluid_io_load_inference_model:

load_inference_model
H
1207  
Hao Wang 已提交
10
-------------------------------
T
Tink_Y 已提交
11

H
Hao Wang 已提交
12
.. py:function:: paddle.fluid.io.load_inference_model(dirname, executor, model_filename=None, params_filename=None, pserver_endpoints=None)
T
Tink_Y 已提交
13

R
RaindragonD 已提交
14
从指定目录中加载预测模型(inference model)。通过这个API,您可以获得模型结构(预测程序)和模型参数。如果您只想下载预训练后的模型的参数,请使用load_params API。更多细节请参考 ``模型/变量的保存、载入与增量训练`` 。
T
Tink_Y 已提交
15 16 17 18

参数:
  - **dirname** (str) – model的路径
  - **executor** (Executor) – 运行 inference model的 ``executor``
H
Hao Wang 已提交
19
  - **model_filename** (str|None) –  存储着预测 Program 的文件名称。如果设置为None,将使用默认的文件名为: ``__model__``
T
Tink_Y 已提交
20
  - **params_filename** (str|None) –  加载所有相关参数的文件名称。如果设置为None,则参数将保存在单独的文件中。
R
RaindragonD 已提交
21
  - **pserver_endpoints** (list|None) – 只有在分布式预测时需要用到。 当在训练时使用分布式 look up table , 需要这个参数. 该参数是 pserver endpoints 的列表
T
Tink_Y 已提交
22

H
Hao Wang 已提交
23
返回: 这个函数的返回有三个元素的元组(Program,feed_target_names, fetch_targets)。Program 是一个 ``Program`` ,它是预测 ``Program``。  ``feed_target_names`` 是一个str列表,它包含需要在预测 ``Program`` 中提供数据的变量的名称。``fetch_targets`` 是一个 ``Variable`` 列表,从中我们可以得到推断结果。
T
Tink_Y 已提交
24 25 26 27 28 29

返回类型:元组(tuple)

抛出异常:
   - ``ValueError`` – 如果 ``dirname`` 非法 

R
RaindragonD 已提交
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
.. code-block:: python

        import paddle.fluid as fluid
        import numpy as np
        main_prog = fluid.Program()
        startup_prog = fluid.Program()
        with fluid.program_guard(main_prog, startup_prog):
            data = fluid.layers.data(name="img", shape=[64, 784], append_batch_size=False)
            w = fluid.layers.create_parameter(shape=[784, 200], dtype='float32')
            b = fluid.layers.create_parameter(shape=[200], dtype='float32')
            hidden_w = fluid.layers.matmul(x=data, y=w)
            hidden_b = fluid.layers.elementwise_add(hidden_w, b)
        place = fluid.CPUPlace()
        exe = fluid.Executor(place)
        exe.run(startup_prog)
        path = "./infer_model"
        fluid.io.save_inference_model(dirname=path, feeded_var_names=['img'],target_vars=[hidden_b], executor=exe, main_program=main_prog)
        tensor_img = np.array(np.random.random((1, 64, 784)), dtype=np.float32)
        [inference_program, feed_target_names, fetch_targets] = (fluid.io.load_inference_model(dirname=path, executor=exe))
        
        results = exe.run(inference_program,
T
Tink_Y 已提交
51 52
                  feed={feed_target_names[0]: tensor_img},
                  fetch_list=fetch_targets)
R
RaindragonD 已提交
53 54 55 56 57 58 59 60 61 62 63 64

        # endpoints是pserver服务器终端列表,下面仅为一个样例
        endpoints = ["127.0.0.1:2023","127.0.0.1:2024"]
        # 如果需要查询表格,我们可以使用:
        [dist_inference_program, dist_feed_target_names, dist_fetch_targets] = (
            fluid.io.load_inference_model(dirname=path,
                                          executor=exe,
                                          pserver_endpoints=endpoints))

        # 在这个示例中,inference program 保存在“ ./infer_model/__model__”中
        # 参数保存在“./infer_mode ”单独的若干文件中
        # 加载 inference program 后, executor 使用 fetch_targets 和 feed_target_names 执行Program,得到预测结果
T
Tink_Y 已提交
65 66 67



H
1207  
Hao Wang 已提交
68 69 70



T
Tink_Y 已提交
71 72 73 74

.. _cn_api_fluid_io_load_params:

load_params
H
1207  
Hao Wang 已提交
75
-------------------------------
T
Tink_Y 已提交
76

H
Hao Wang 已提交
77
.. py:function:: paddle.fluid.io.load_params(executor, dirname, main_program=None, filename=None)
T
Tink_Y 已提交
78

H
Hao Wang 已提交
79
该函数从给定 ``main_program`` 中取出所有参数,然后从目录 ``dirname`` 中或 ``filename`` 指定的文件中加载这些参数。
T
Tink_Y 已提交
80

H
Hao Wang 已提交
81
``dirname`` 用于存有变量的目录。如果变量保存在指定目录的若干文件中,设置文件名 None; 如果所有变量保存在一个文件中,请使用filename来指明这个文件。
T
Tink_Y 已提交
82

H
Hao Wang 已提交
83
注意:有些变量不是参数,但它们对于训练是必要的。因此,调用 ``save_params()`` 和 ``load_params()`` 来保存和加载参数是不够的,可以使用 ``save_persistables()`` 和 ``load_persistables()`` 代替这两个函数。
T
Tink_Y 已提交
84

R
RaindragonD 已提交
85 86
如果您想下载预训练后的模型结构和参数用于预测,请使用load_inference_model API。更多细节请参考 :ref:`api_guide_model_save_reader`。

T
Tink_Y 已提交
87
参数:
R
RaindragonD 已提交
88 89 90 91
    - **executor**  (Executor) – 加载变量的 executor
    - **dirname**  (str) – 目录路径
    - **main_program**  (Program|None) – 需要加载变量的 Program。如果为 None,则使用 default_main_Program 。默认值: None
    - **filename**  (str|None) – 保存变量的文件。如果想分开保存变量,设置 filename=None. 默认值: None
T
Tink_Y 已提交
92 93 94 95 96

返回: None
  
**代码示例**

R
RaindragonD 已提交
97
.. code-block:: python
H
Hao Wang 已提交
98

T
Tink_Y 已提交
99 100 101 102 103
    exe = fluid.Executor(fluid.CPUPlace())
    param_path = "./my_paddle_model"
    prog = fluid.default_main_program()
    fluid.io.load_params(executor=exe, dirname=param_path,
                        main_program=None)
H
Hao Wang 已提交
104

T
Tink_Y 已提交
105 106


H
1207  
Hao Wang 已提交
107 108 109



T
Tink_Y 已提交
110 111 112 113

.. _cn_api_fluid_io_load_persistables:

load_persistables
H
1207  
Hao Wang 已提交
114
-------------------------------
T
Tink_Y 已提交
115

H
Hao Wang 已提交
116
.. py:function:: paddle.fluid.io.load_persistables(executor, dirname, main_program=None, filename=None)
T
Tink_Y 已提交
117

H
Hao Wang 已提交
118
该函数从给定 ``main_program`` 中取出所有 ``persistable==True`` 的变量(即长期变量),然后将它们从目录 ``dirname`` 中或 ``filename`` 指定的文件中加载出来。
T
Tink_Y 已提交
119

H
Hao Wang 已提交
120
``dirname`` 用于指定存有长期变量的目录。如果变量保存在指定目录的若干文件中,设置文件名 None; 如果所有变量保存在一个文件中,请使用filename来指定它。
T
Tink_Y 已提交
121 122 123 124 125 126 127 128 129 130 131

参数:
    - **executor**  (Executor) – 加载变量的 executor
    - **dirname**  (str) – 目录路径
    - **main_program**  (Program|None) – 需要加载变量的 Program。如果为 None,则使用 default_main_Program 。默认值: None
    - **filename**  (str|None) – 保存变量的文件。如果想分开保存变量,设置 filename=None. 默认值: None

返回: None
  
**代码示例**

R
RaindragonD 已提交
132
.. code-block:: python
T
Tink_Y 已提交
133 134 135 136 137 138 139 140 141

    exe = fluid.Executor(fluid.CPUPlace())
    param_path = "./my_paddle_model"
    prog = fluid.default_main_program()
    fluid.io.load_persistables(executor=exe, dirname=param_path,
                               main_program=None)
 


H
1207  
Hao Wang 已提交
142 143 144



T
Tink_Y 已提交
145 146 147 148

.. _cn_api_fluid_io_load_vars:

load_vars
H
1207  
Hao Wang 已提交
149
-------------------------------
T
Tink_Y 已提交
150

H
Hao Wang 已提交
151
.. py:function:: paddle.fluid.io.load_vars(executor, dirname, main_program=None, vars=None, predicate=None, filename=None)
T
Tink_Y 已提交
152 153 154 155 156

``executor`` 从指定目录加载变量。

有两种方法来加载变量:方法一,``vars`` 为变量的列表。方法二,将已存在的 ``Program`` 赋值给 ``main_program`` ,然后将加载 ``Program`` 中的所有变量。第一种方法优先级更高。如果指定了 vars,那么忽略 ``main_program`` 和 ``predicate`` 。

H
Hao Wang 已提交
157
``dirname`` 用于指定加载变量的目录。如果变量保存在指定目录的若干文件中,设置文件名 None; 如果所有变量保存在一个文件中,请使用 ``filename`` 来指定它。
T
Tink_Y 已提交
158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173

参数:
 - **executor**  (Executor) – 加载变量的 executor
 - **dirname**  (str) – 目录路径
 - **main_program**  (Program|None) – 需要加载变量的 Program。如果为 None,则使用 default_main_Program 。默认值: None
 - **vars**  (list[Variable]|None) –  要加载的变量的列表。 优先级高于main_program。默认值: None
 - **predicate**  (function|None) – 如果不等于None,当指定main_program, 那么只有 predicate(variable)==True 时,main_program中的变量会被加载。
 - **filename**  (str|None) – 保存变量的文件。如果想分开保存变量,设置 filename=None. 默认值: None

抛出异常:
  - ``TypeError`` - 如果参数 ``main_program`` 为 None 或为一个非 ``Program`` 的实例
   
返回: None
  
**代码示例**

R
RaindragonD 已提交
174
.. code-block:: python
T
Tink_Y 已提交
175
    
R
RaindragonD 已提交
176 177 178 179 180 181 182 183 184 185 186 187 188
    import paddle.fluid as fluid
    main_prog = fluid.Program()
    startup_prog = fluid.Program()
    with fluid.program_guard(main_prog, startup_prog):
        data = fluid.layers.data(name="img", shape=[64, 784], append_batch_size=False)
        w = fluid.layers.create_parameter(shape=[784, 200], dtype='float32', name='fc_w')
        b = fluid.layers.create_parameter(shape=[200], dtype='float32', name='fc_b')
        hidden_w = fluid.layers.matmul(x=data, y=w)
        hidden_b = fluid.layers.elementwise_add(hidden_w, b)
    place = fluid.CPUPlace()
    exe = fluid.Executor(place)
    exe.run(startup_prog)

T
Tink_Y 已提交
189 190 191 192 193 194
    param_path = "./my_paddle_model"

    # 第一种使用方式 使用 main_program 指定变量
    def name_has_fc(var):
        res = "fc" in var.name
        return res
R
RaindragonD 已提交
195 196
    fluid.io.save_vars(executor=exe, dirname=param_path, main_program=main_prog, vars=None, predicate=name_has_fc)
    fluid.io.load_vars(executor=exe, dirname=param_path, main_program=main_prog, vars=None, predicate=name_has_fc)
H
1207  
Hao Wang 已提交
197 198
    #加载所有`main_program`中变量名包含 ‘fc’ 的变量
    #并且此前所有变量应该保存在不同文件中
T
Tink_Y 已提交
199

R
RaindragonD 已提交
200 201 202 203 204
    #用法2:使用 `vars` 来使变量具体化
    path = "./my_paddle_vars"
    var_list = [w, b]
    fluid.io.save_vars(executor=exe, dirname=path, vars=var_list,
                       filename="vars_file")
T
Tink_Y 已提交
205 206
    fluid.io.load_vars(executor=exe, dirname=path, vars=var_list,
                       filename="vars_file")
R
RaindragonD 已提交
207 208
    # 加载w和b,它们此前应被保存在同一名为'var_file'的文件中
    # 该文件所在路径为 "./my_paddle_model"
T
Tink_Y 已提交
209 210 211
 


Z
zy0531 已提交
212
.. _cn_api_fluid_io_PyReader:
H
1207  
Hao Wang 已提交
213

Z
zy0531 已提交
214 215 216
PyReader
-------------------------------

R
RaindragonD 已提交
217
.. py:class:: paddle.fluid.io.PyReader(feed_list=None, capacity=None, use_double_buffer=True, iterable=True, return_list=False)
Z
zy0531 已提交
218 219 220 221 222


在python中为数据输入创建一个reader对象。将使用python线程预取数据,并将其异步插入队列。当调用Executor.run(…)时,将自动提取队列中的数据。 

参数:
R
RaindragonD 已提交
223
  - **feed_list** (list(Variable)|tuple(Variable))  – feed变量列表,由 ``fluid.layers.data()`` 创建。在可迭代模式下它可以被设置为None。
Z
zy0531 已提交
224
  - **capacity** (int) – 在Pyreader对象中维护的队列的容量。
R
RaindragonD 已提交
225
  - **use_double_buffer** (bool) – 是否使用 ``double_buffer_reader`` 来加速数据输入。
Z
zy0531 已提交
226
  - **iterable** (bool) –  被创建的reader对象是否可迭代。
R
RaindragonD 已提交
227
  - **eturn_list** (bool) –  是否以list的形式将返回值
Z
zy0531 已提交
228 229 230 231 232 233 234 235

返回: 被创建的reader对象

返回类型: reader (Reader)


**代码示例**

236
1.如果iterable=False,则创建的Pyreader对象几乎与 ``fluid.layers.py_reader()`` 相同。算子将被插入program中。用户应该在每个epoch之前调用start(),并在epoch结束时捕获 ``Executor.run()`` 抛出的 ``fluid.core.EOFException `` 。一旦捕获到异常,用户应该调用reset()手动重置reader。
Z
zy0531 已提交
237

R
RaindragonD 已提交
238 239 240 241 242
.. code-block:: python

    EPOCH_NUM = 3
    ITER_NUM = 5
    BATCH_SIZE = 3
Z
zy0531 已提交
243

R
RaindragonD 已提交
244 245 246 247 248 249 250 251 252 253 254 255
    def reader_creator_random_image_and_label(height, width):
        def reader():
            for i in range(ITER_NUM):
                fake_image = np.random.uniform(low=0,
                                               high=255,
                                               size=[height, width])
                fake_label = np.ones([1])
                yield fake_image, fake_label
        return reader

    image = fluid.layers.data(name='image', shape=[784, 784], dtype='float32')
    label = fluid.layers.data(name='label', shape=[1], dtype='int64')
Z
zy0531 已提交
256 257

    reader = fluid.io.PyReader(feed_list=[image, label],
R
RaindragonD 已提交
258 259 260 261 262 263 264 265 266 267
                               capacity=4,
                               iterable=False)

    user_defined_reader = reader_creator_random_image_and_label(784, 784)
    reader.decorate_sample_list_generator(
        paddle.batch(user_defined_reader, batch_size=BATCH_SIZE))
    # 此处省略网络定义
    executor = fluid.Executor(fluid.CUDAPlace(0))
    executor.run(fluid.default_startup_program())
    for i in range(EPOCH_NUM):
Z
zy0531 已提交
268 269
        reader.start()
        while True:
R
RaindragonD 已提交
270 271 272 273 274
            try:
                executor.run(feed=None)
            except fluid.core.EOFException:
                reader.reset()
                break
Z
zy0531 已提交
275 276


R
RaindragonD 已提交
277
2.如果iterable=True,则创建的Pyreader对象与程序分离。程序中不会插入任何算子。在本例中,创建的reader是一个python生成器,它是不可迭代的。用户应将从Pyreader对象生成的数据输入 ``Executor.run(feed=...)`` 。
Z
zy0531 已提交
278

R
RaindragonD 已提交
279
.. code-block:: python
Z
zy0531 已提交
280

R
RaindragonD 已提交
281 282 283
   EPOCH_NUM = 3
   ITER_NUM = 5
   BATCH_SIZE = 10
Z
zy0531 已提交
284

R
RaindragonD 已提交
285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316
   def reader_creator_random_image(height, width):
       def reader():
           for i in range(ITER_NUM):
               yield np.random.uniform(low=0, high=255, size=[height, width]),
       return reader

   image = fluid.layers.data(name='image', shape=[784, 784], dtype='float32')
   reader = fluid.io.PyReader(feed_list=[image], capacity=4, iterable=True, return_list=False)

   user_defined_reader = reader_creator_random_image(784, 784)
   reader.decorate_sample_list_generator(
       paddle.batch(user_defined_reader, batch_size=BATCH_SIZE),
       fluid.core.CUDAPlace(0))
   # 此处省略网络定义
   executor = fluid.Executor(fluid.CUDAPlace(0))
   executor.run(fluid.default_main_program())

   for _ in range(EPOCH_NUM):
       for data in reader():
           executor.run(feed=data)

3. return_list=True,返回值将用list表示而非dict

.. code-block:: python

   import paddle
   import paddle.fluid as fluid
   import numpy as np

   EPOCH_NUM = 3
   ITER_NUM = 5
   BATCH_SIZE = 10
Z
zy0531 已提交
317

R
RaindragonD 已提交
318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341
   def reader_creator_random_image(height, width):
       def reader():
           for i in range(ITER_NUM):
               yield np.random.uniform(low=0, high=255, size=[height, width]),
       return reader

   image = fluid.layers.data(name='image', shape=[784, 784], dtype='float32')
   reader = fluid.io.PyReader(feed_list=[image], capacity=4, iterable=True, return_list=True)

   user_defined_reader = reader_creator_random_image(784, 784)
   reader.decorate_sample_list_generator(
       paddle.batch(user_defined_reader, batch_size=BATCH_SIZE),
       fluid.core.CPUPlace())
   # 此处省略网络定义
   executor = fluid.Executor(fluid.core.CPUPlace())
   executor.run(fluid.default_main_program())

   for _ in range(EPOCH_NUM):
       for data in reader():
           executor.run(feed={"image": data[0]})



.. py:method:: start()
Z
zy0531 已提交
342 343 344

启动数据输入线程。只能在reader对象不可迭代时调用。

R
RaindragonD 已提交
345
**代码示例**
Z
zy0531 已提交
346

R
RaindragonD 已提交
347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373
.. code-block:: python

  BATCH_SIZE = 10
     
  def generator():
    for i in range(5):
       yield np.random.uniform(low=0, high=255, size=[784, 784]),
     
  image = fluid.layers.data(name='image', shape=[784, 784], dtype='float32')
  reader = fluid.io.PyReader(feed_list=[image], capacity=4, iterable=False)
  reader.decorate_sample_list_generator(
    paddle.batch(generator, batch_size=BATCH_SIZE))
     
  executor = fluid.Executor(fluid.CUDAPlace(0))
  executor.run(fluid.default_startup_program())
  for i in range(3):
    reader.start()
    while True:
        try:
            executor.run(feed=None)
        except fluid.core.EOFException:
            reader.reset()
            break

.. py:method:: reset()

当 ``fluid.core.EOFException`` 抛出时重置reader对象。只能在reader对象不可迭代时调用。
Z
zy0531 已提交
374

R
RaindragonD 已提交
375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401
**代码示例**

.. code-block:: python

            BATCH_SIZE = 10
     
            def generator():
                for i in range(5):
                    yield np.random.uniform(low=0, high=255, size=[784, 784]),
     
            image = fluid.layers.data(name='image', shape=[784, 784], dtype='float32')
            reader = fluid.io.PyReader(feed_list=[image], capacity=4, iterable=False)
            reader.decorate_sample_list_generator(
                paddle.batch(generator, batch_size=BATCH_SIZE))
     
            executor = fluid.Executor(fluid.CUDAPlace(0))
            executor.run(fluid.default_startup_program())
            for i in range(3):
                reader.start()
                while True:
                    try:
                        executor.run(feed=None)
                    except fluid.core.EOFException:
                        reader.reset()
                        break

.. py:method:: decorate_sample_generator(sample_generator, batch_size, drop_last=True, places=None)
Z
zy0531 已提交
402 403 404

设置Pyreader对象的数据源。

R
RaindragonD 已提交
405
提供的 ``sample_generator`` 应该是一个python生成器,它生成的数据类型应为list(numpy.ndarray)。
Z
zy0531 已提交
406 407 408 409 410 411

当Pyreader对象不可迭代时,必须设置 ``places`` 。

如果所有的输入都没有LOD,这个方法比 ``decorate_sample_list_generator(paddle.batch(sample_generator, ...))`` 更快。

参数:
R
RaindragonD 已提交
412
  - **sample_generator** (generator)  – Python生成器,yield 类型为list(numpy.ndarray)
Z
zy0531 已提交
413 414 415 416
  - **batch_size** (int) – batch size,必须大于0
  - **drop_last** (bool) – 当样本数小于batch数量时,是否删除最后一个batch
  - **places** (None|list(CUDAPlace)|list(CPUPlace)) –  位置列表。当PyReader可迭代时必须被提供

R
RaindragonD 已提交
417
**代码示例**
Z
zy0531 已提交
418

R
RaindragonD 已提交
419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451
.. code-block:: python
     
            EPOCH_NUM = 3
            ITER_NUM = 15
            BATCH_SIZE = 3
     
            def random_image_and_label_generator(height, width):
                def generator():
                    for i in range(ITER_NUM):
                        fake_image = np.random.uniform(low=0,
                                                       high=255,
                                                       size=[height, width])
                        fake_label = np.array([1])
                        yield fake_image, fake_label
                return generator
     
            image = fluid.layers.data(name='image', shape=[784, 784], dtype='float32')
            label = fluid.layers.data(name='label', shape=[1], dtype='int32')
            reader = fluid.io.PyReader(feed_list=[image, label], capacity=4, iterable=True)
     
            user_defined_generator = random_image_and_label_generator(784, 784)
            reader.decorate_sample_generator(user_defined_generator,
                                             batch_size=BATCH_SIZE,
                                             places=[fluid.CUDAPlace(0)])
            # 省略了网络的定义
            executor = fluid.Executor(fluid.CUDAPlace(0))
            executor.run(fluid.default_main_program())
     
            for _ in range(EPOCH_NUM):
                for data in reader():
                    executor.run(feed=data)

.. py:method:: decorate_sample_list_generator(reader, places=None)
Z
zy0531 已提交
452 453 454 455 456 457 458 459 460 461 462

设置Pyreader对象的数据源。

提供的 ``reader`` 应该是一个python生成器,它生成列表(numpy.ndarray)类型的批处理数据。

当Pyreader对象不可迭代时,必须设置 ``places`` 。

参数:
  - **reader** (generator)  – 返回列表(numpy.ndarray)类型的批处理数据的Python生成器
  - **places** (None|list(CUDAPlace)|list(CPUPlace)) –  位置列表。当PyReader可迭代时必须被提供

R
RaindragonD 已提交
463
**代码示例**
Z
zy0531 已提交
464

R
RaindragonD 已提交
465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497
.. code-block:: python
            
            EPOCH_NUM = 3
            ITER_NUM = 15
            BATCH_SIZE = 3
     
            def random_image_and_label_generator(height, width):
                def generator():
                    for i in range(ITER_NUM):
                        fake_image = np.random.uniform(low=0,
                                                       high=255,
                                                       size=[height, width])
                        fake_label = np.ones([1])
                        yield fake_image, fake_label
                return generator
     
            image = fluid.layers.data(name='image', shape=[784, 784], dtype='float32')
            label = fluid.layers.data(name='label', shape=[1], dtype='int32')
            reader = fluid.io.PyReader(feed_list=[image, label], capacity=4, iterable=True)
     
            user_defined_generator = random_image_and_label_generator(784, 784)
            reader.decorate_sample_list_generator(
                paddle.batch(user_defined_generator, batch_size=BATCH_SIZE),
                fluid.core.CUDAPlace(0))
            # 省略了网络的定义
            executor = fluid.Executor(fluid.core.CUDAPlace(0))
            executor.run(fluid.default_main_program())
     
            for _ in range(EPOCH_NUM):
                for data in reader():
                    executor.run(feed=data)

.. py:method:: decorate_batch_generator(reader, places=None)
Z
zy0531 已提交
498 499 500 501 502 503 504 505 506 507

设置Pyreader对象的数据源。

提供的 ``reader`` 应该是一个python生成器,它生成列表(numpy.ndarray)类型或LoDTensor类型的批处理数据。

当Pyreader对象不可迭代时,必须设置 ``places`` 。

参数:
  - **reader** (generator)  – 返回LoDTensor类型的批处理数据的Python生成器
  - **places** (None|list(CUDAPlace)|list(CPUPlace)) –  位置列表。当PyReader可迭代时必须被提供
H
1207  
Hao Wang 已提交
508

R
RaindragonD 已提交
509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541
**代码示例**

.. code-block:: python

            EPOCH_NUM = 3
            ITER_NUM = 15
            BATCH_SIZE = 3
     
            def random_image_and_label_generator(height, width):
                def generator():
                    for i in range(ITER_NUM):
                        batch_image = np.random.uniform(low=0,
                                                        high=255,
                                                        size=[BATCH_SIZE, height, width])
                        batch_label = np.ones([BATCH_SIZE, 1])
                        yield batch_image, batch_label
                return generator
     
            image = fluid.layers.data(name='image', shape=[784, 784], dtype='float32')
            label = fluid.layers.data(name='label', shape=[1], dtype='int32')
            reader = fluid.io.PyReader(feed_list=[image, label], capacity=4, iterable=True)
     
            user_defined_generator = random_image_and_label_generator(784, 784)
            reader.decorate_batch_generator(user_defined_generator, fluid.CUDAPlace(0))
            # 省略了网络的定义
            executor = fluid.Executor(fluid.CUDAPlace(0))
            executor.run(fluid.default_main_program())
     
            for _ in range(EPOCH_NUM):
                for data in reader():
                    executor.run(feed=data)


T
Tink_Y 已提交
542 543 544
.. _cn_api_fluid_io_save_inference_model:

save_inference_model
H
1207  
Hao Wang 已提交
545
-------------------------------
T
Tink_Y 已提交
546

R
RaindragonD 已提交
547
.. py:function:: paddle.fluid.io.save_inference_model(dirname, feeded_var_names, target_vars, executor, main_program=None, model_filename=None, params_filename=None, export_for_deployment=True,  program_only=False)
T
Tink_Y 已提交
548

H
Hao Wang 已提交
549
修改指定的 ``main_program`` ,构建一个专门用于预测的 ``Program``,然后  ``executor`` 把它和所有相关参数保存到 ``dirname`` 中。
T
Tink_Y 已提交
550

H
Hao Wang 已提交
551 552

``dirname`` 用于指定保存变量的目录。如果变量保存在指定目录的若干文件中,设置文件名 None; 如果所有变量保存在一个文件中,请使用filename来指定它。
T
Tink_Y 已提交
553

R
RaindragonD 已提交
554 555 556
如果您仅想保存您训练好的模型的参数,请使用save_params API。更多细节请参考 :ref:`api_guide_model_save_reader` 。


T
Tink_Y 已提交
557
参数:
H
Hao Wang 已提交
558 559 560
  - **dirname** (str) – 保存预测model的路径
  - **feeded_var_names** (list[str]) – 预测(inference)需要 feed 的数据
  - **target_vars** (list[Variable]) – 保存预测(inference)结果的 Variables
T
Tink_Y 已提交
561
  - **executor** (Executor) –  executor 保存  inference model
H
Hao Wang 已提交
562 563
  - **main_program** (Program|None) – 使用 ``main_program`` ,构建一个专门用于预测的 ``Program`` (inference model). 如果为None, 使用   ``default main program``   默认: None.
  - **model_filename** (str|None) – 保存预测Program 的文件名称。如果设置为None,将使用默认的文件名为: ``__model__``
T
Tink_Y 已提交
564
  - **params_filename** (str|None) – 保存所有相关参数的文件名称。如果设置为None,则参数将保存在单独的文件中。
H
Hao Wang 已提交
565
  - **export_for_deployment** (bool) – 如果为真,Program将被修改为只支持直接预测部署的Program。否则,将存储更多的信息,方便优化和再训练。目前只支持True。
R
RaindragonD 已提交
566
  - **program_only** (bool) – 如果为真,将只保存预测程序,而不保存程序的参数。
T
Tink_Y 已提交
567

Z
zy0531 已提交
568 569 570
返回: 获取的变量名列表

返回类型:target_var_name_list(list)
T
Tink_Y 已提交
571 572 573 574 575 576 577

抛出异常:
 - ``ValueError`` – 如果 ``feed_var_names`` 不是字符串列表
 - ``ValueError`` – 如果 ``target_vars`` 不是 ``Variable`` 列表

**代码示例**

R
RaindragonD 已提交
578 579 580
.. code-block:: python

    import paddle.fluid as fluid
T
Tink_Y 已提交
581 582 583

    path = "./infer_model"

R
RaindragonD 已提交
584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603
    # 用户定义网络,此处以softmax回归为例
    image = fluid.layers.data(name='img', shape=[1, 28, 28], dtype='float32')
    label = fluid.layers.data(name='label', shape=[1], dtype='int64')
    feeder = fluid.DataFeeder(feed_list=[image, label], place=fluid.CPUPlace())
    predict = fluid.layers.fc(input=image, size=10, act='softmax')

    loss = fluid.layers.cross_entropy(input=predict, label=label)
    avg_loss = fluid.layers.mean(loss)

    exe = fluid.Executor(fluid.CPUPlace())
    exe.run(fluid.default_startup_program())

    # 数据输入及训练过程

    # 保存预测模型。注意我们不在这个示例中保存标签和损失。
    fluid.io.save_inference_model(dirname=path, feeded_var_names=['img'], target_vars=[predict], executor=exe)

    # 在这个示例中,函数将修改默认的主程序让它适合于预测‘predict_var’
    # 修改的预测Program 将被保存在 ./infer_model/__model__”中。
    # 参数将保存在文件夹下的单独文件中 ./infer_mode
T
Tink_Y 已提交
604 605 606 607




H
1207  
Hao Wang 已提交
608 609 610



T
Tink_Y 已提交
611 612 613 614

.. _cn_api_fluid_io_save_params:

save_params
H
1207  
Hao Wang 已提交
615
-------------------------------
T
Tink_Y 已提交
616

H
Hao Wang 已提交
617
.. py:function:: paddle.fluid.io.save_params(executor, dirname, main_program=None, filename=None)
T
Tink_Y 已提交
618

H
Hao Wang 已提交
619
该函数从 ``main_program`` 中取出所有参数,然后将它们保存到 ``dirname`` 目录下或名为 ``filename`` 的文件中。
T
Tink_Y 已提交
620

H
Hao Wang 已提交
621
``dirname`` 用于指定保存变量的目标目录。如果想将变量保存到多个独立文件中,设置 ``filename`` 为 None; 如果想将所有变量保存在单个文件中,请使用 ``filename`` 来指定该文件的命名。
T
Tink_Y 已提交
622

R
RaindragonD 已提交
623
注意:有些变量不是参数,但它们对于训练是必要的。因此,调用 ``save_params()`` 和 ``load_params()`` 来保存和加载参数是不够的,可以使用 ``save_persistables()`` 和 ``load_persistables()`` 代替这两个函数。如果您想要储存您的模型用于预测,请使用save_inference_model API。更多细节请参考 :ref:`api_guide_model_save_reader`。
T
Tink_Y 已提交
624 625 626 627 628 629 630


参数:
 - **executor**  (Executor) – 保存变量的 executor
 - **dirname**  (str) – 目录路径
 - **main_program**  (Program|None) – 需要保存变量的 Program。如果为 None,则使用 default_main_Program 。默认值: None
 - **vars**  (list[Variable]|None) –  要保存的所有变量的列表。 优先级高于main_program。默认值: None
H
Hao Wang 已提交
631
 - **filename**  (str|None) – 保存变量的文件。如果想分不同独立文件来保存变量,设置 filename=None. 默认值: None
T
Tink_Y 已提交
632 633 634 635 636
 
返回: None
  
**代码示例**

R
RaindragonD 已提交
637
.. code-block:: python
T
Tink_Y 已提交
638 639 640 641 642 643 644 645 646
    
    exe = fluid.Executor(fluid.CPUPlace())
    param_path = "./my_paddle_model"
    prog = fluid.default_main_program()
    fluid.io.save_params(executor=exe, dirname=param_path,
                         main_program=None)
                         


H
1207  
Hao Wang 已提交
647 648 649



T
Tink_Y 已提交
650 651 652 653

.. _cn_api_fluid_io_save_persistables:

save_persistables
H
1207  
Hao Wang 已提交
654
-------------------------------
T
Tink_Y 已提交
655

H
Hao Wang 已提交
656
.. py:function:: paddle.fluid.io.save_persistables(executor, dirname, main_program=None, filename=None)
T
Tink_Y 已提交
657

H
Hao Wang 已提交
658
该函数从给定 ``main_program`` 中取出所有 ``persistable==True`` 的变量,然后将它们保存到目录 ``dirname`` 中或 ``filename`` 指定的文件中。
T
Tink_Y 已提交
659

H
Hao Wang 已提交
660
``dirname`` 用于指定保存长期变量的目录。如果想将变量保存到指定目录的若干文件中,设置 ``filename=None`` ; 如果想将所有变量保存在一个文件中,请使用 ``filename`` 来指定它。
T
Tink_Y 已提交
661 662 663 664 665 666 667 668 669 670 671 672 673

参数:
 - **executor**  (Executor) – 保存变量的 executor
 - **dirname**  (str) – 目录路径
 - **main_program**  (Program|None) – 需要保存变量的 Program。如果为 None,则使用 default_main_Program 。默认值: None
 - **predicate**  (function|None) – 如果不等于None,当指定main_program, 那么只有 predicate(variable)==True 时,main_program中的变量
 - **vars**  (list[Variable]|None) –  要保存的所有变量的列表。 优先级高于main_program。默认值: None
 - **filename**  (str|None) – 保存变量的文件。如果想分开保存变量,设置 filename=None. 默认值: None
 
返回: None
  
**代码示例**

R
RaindragonD 已提交
674
.. code-block:: python
T
Tink_Y 已提交
675
    
R
RaindragonD 已提交
676 677
    import paddle.fluid as fluid

T
Tink_Y 已提交
678 679 680
    exe = fluid.Executor(fluid.CPUPlace())
    param_path = "./my_paddle_model"
    prog = fluid.default_main_program()
Z
zy0531 已提交
681
    # `prog` 可以是由用户自定义的program
T
Tink_Y 已提交
682
    fluid.io.save_persistables(executor=exe, dirname=param_path,
Z
zy0531 已提交
683
                               main_program=prog)
T
Tink_Y 已提交
684 685 686 687
    
    


H
1207  
Hao Wang 已提交
688

T
Tink_Y 已提交
689 690 691 692 693 694



.. _cn_api_fluid_io_save_vars:

save_vars
H
1207  
Hao Wang 已提交
695
-------------------------------
T
Tink_Y 已提交
696

H
Hao Wang 已提交
697
.. py:function:: paddle.fluid.io.save_vars(executor, dirname, main_program=None, vars=None, predicate=None, filename=None)
T
Tink_Y 已提交
698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719

通过 ``Executor`` ,此函数将变量保存到指定目录下。

有两种方法可以指定要保存的变量:第一种方法,在列表中列出变量并将其传给 ``vars`` 参数。第二种方法是,将现有程序分配给 ``main_program`` ,它会保存program中的所有变量。第一种方式具有更高的优先级。换句话说,如果分配了变量,则将忽略 ``main_program`` 和 ``predicate`` 。

``dirname`` 用于指定保存变量的文件夹。如果您希望将变量分别保存在文件夹目录的多个单独文件中,请设置 ``filename`` 为无;如果您希望将所有变量保存在单个文件中,请使用 ``filename`` 指定它。

参数:
      - **executor** (Executor)- 为保存变量而运行的执行器。
      - **dirname** (str)- 目录路径。
      - **main_program** (Program | None)- 保存变量的程序。如果为None,将自动使用默认主程序。默认值:None。
      - **vars** (list [Variable] | None)- 包含要保存的所有变量的列表。它的优先级高于 ``main_program`` 。默认值:None。
      - **predicate** (function | None)- 如果它不是None,则只保存 ``main_program`` 中使 :math:`predicate(variable)== True` 的变量。它仅在我们使用 ``main_program`` 指定变量时才起作用(换句话说,vars为None)。默认值:None。
      - **filename** (str | None)- 保存所有变量的文件。如果您希望单独保存变量,请将其设置为None。默认值:None。

返回:     None

抛出异常:    
    - ``TypeError`` - 如果main_program不是Program的实例,也不是None。

**代码示例**

R
RaindragonD 已提交
720 721 722 723 724 725 726 727 728 729 730 731 732 733 734
.. code-block:: python
      
      import paddle.fluid as fluid
      main_prog = fluid.Program()
      startup_prog = fluid.Program()
      with fluid.program_guard(main_prog, startup_prog):
          data = fluid.layers.data(name="img", shape=[64, 784], append_batch_size=False)
          w = fluid.layers.create_parameter(shape=[784, 200], dtype='float32', name='fc_w')
          b = fluid.layers.create_parameter(shape=[200], dtype='float32', name='fc_b')
          hidden_w = fluid.layers.matmul(x=data, y=w)
          hidden_b = fluid.layers.elementwise_add(hidden_w, b)
      place = fluid.CPUPlace()
      exe = fluid.Executor(place)
      exe.run(startup_prog)
     
T
Tink_Y 已提交
735 736 737 738 739 740 741
      param_path = "./my_paddle_model"

      # 第一种用法:用main_program来指定变量。
      def name_has_fc(var):
          res = "fc" in var.name
          return res

R
RaindragonD 已提交
742
      fluid.io.save_vars(executor=exe, dirname=param_path, main_program=main_prog, vars=None, predicate = name_has_fc)
T
Tink_Y 已提交
743 744 745 746 747
      # 将main_program中名中包含“fc”的的所有变量保存。
      # 变量将分开保存。


      # 第二种用法: 用vars来指定变量。
R
RaindragonD 已提交
748 749
      var_list = [w, b]
      path = "./my_paddle_vars"
T
Tink_Y 已提交
750 751
      fluid.io.save_vars(executor=exe, dirname=path, vars=var_list,
                         filename="vars_file")
R
RaindragonD 已提交
752 753
      # var_a,var_b和var_c将被保存。
      #他们将使用同一文件,名为“var_file”,保存在路径“./my_paddle_vars”下。
T
Tink_Y 已提交
754 755


H
1207  
Hao Wang 已提交
756 757 758



T
Tink_Y 已提交
759