io_cn.rst 32.9 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

X
xsrobin 已提交
99
    import paddle.fluid as fluid
T
Tink_Y 已提交
100 101 102 103 104
    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 已提交
105

T
Tink_Y 已提交
106 107


H
1207  
Hao Wang 已提交
108 109 110



T
Tink_Y 已提交
111 112 113 114

.. _cn_api_fluid_io_load_persistables:

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

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

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

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

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

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

R
RaindragonD 已提交
133
.. code-block:: python
T
Tink_Y 已提交
134

X
xsrobin 已提交
135
    import paddle.fluid as fluid
T
Tink_Y 已提交
136 137 138 139 140 141 142 143
    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 已提交
144 145 146



T
Tink_Y 已提交
147 148 149 150

.. _cn_api_fluid_io_load_vars:

load_vars
H
1207  
Hao Wang 已提交
151
-------------------------------
T
Tink_Y 已提交
152

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

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

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

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

参数:
 - **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 已提交
176
.. code-block:: python
T
Tink_Y 已提交
177
    
R
RaindragonD 已提交
178 179 180 181 182 183 184 185 186 187 188 189 190
    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 已提交
191 192 193 194 195 196
    param_path = "./my_paddle_model"

    # 第一种使用方式 使用 main_program 指定变量
    def name_has_fc(var):
        res = "fc" in var.name
        return res
R
RaindragonD 已提交
197 198
    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 已提交
199 200
    #加载所有`main_program`中变量名包含 ‘fc’ 的变量
    #并且此前所有变量应该保存在不同文件中
T
Tink_Y 已提交
201

R
RaindragonD 已提交
202 203 204 205 206
    #用法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 已提交
207 208
    fluid.io.load_vars(executor=exe, dirname=path, vars=var_list,
                       filename="vars_file")
R
RaindragonD 已提交
209 210
    # 加载w和b,它们此前应被保存在同一名为'var_file'的文件中
    # 该文件所在路径为 "./my_paddle_model"
T
Tink_Y 已提交
211 212 213
 


Z
zy0531 已提交
214
.. _cn_api_fluid_io_PyReader:
H
1207  
Hao Wang 已提交
215

Z
zy0531 已提交
216 217 218
PyReader
-------------------------------

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


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

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

返回: 被创建的reader对象

返回类型: reader (Reader)


**代码示例**

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

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

X
xsrobin 已提交
242
    import paddle.fluid as fluid
R
RaindragonD 已提交
243 244 245
    EPOCH_NUM = 3
    ITER_NUM = 5
    BATCH_SIZE = 3
Z
zy0531 已提交
246

R
RaindragonD 已提交
247 248 249 250 251 252 253 254 255 256 257 258
    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 已提交
259 260

    reader = fluid.io.PyReader(feed_list=[image, label],
R
RaindragonD 已提交
261 262 263 264 265 266 267 268 269 270
                               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 已提交
271 272
        reader.start()
        while True:
R
RaindragonD 已提交
273 274 275 276 277
            try:
                executor.run(feed=None)
            except fluid.core.EOFException:
                reader.reset()
                break
Z
zy0531 已提交
278 279


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

R
RaindragonD 已提交
282
.. code-block:: python
Z
zy0531 已提交
283

X
xsrobin 已提交
284
   import paddle.fluid as fluid
R
RaindragonD 已提交
285 286 287
   EPOCH_NUM = 3
   ITER_NUM = 5
   BATCH_SIZE = 10
Z
zy0531 已提交
288

R
RaindragonD 已提交
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 317 318 319 320
   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 已提交
321

R
RaindragonD 已提交
322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345
   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 已提交
346 347 348

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

R
RaindragonD 已提交
349
**代码示例**
Z
zy0531 已提交
350

R
RaindragonD 已提交
351 352
.. code-block:: python

X
xsrobin 已提交
353
  import paddle.fluid as fluid
R
RaindragonD 已提交
354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378
  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 已提交
379

R
RaindragonD 已提交
380 381 382 383
**代码示例**

.. code-block:: python

X
xsrobin 已提交
384
            import paddle.fluid as fluid
R
RaindragonD 已提交
385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407
            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 已提交
408 409 410

设置Pyreader对象的数据源。

R
RaindragonD 已提交
411
提供的 ``sample_generator`` 应该是一个python生成器,它生成的数据类型应为list(numpy.ndarray)。
Z
zy0531 已提交
412 413 414 415 416 417

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

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

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

R
RaindragonD 已提交
423
**代码示例**
Z
zy0531 已提交
424

R
RaindragonD 已提交
425 426
.. code-block:: python
     
X
xsrobin 已提交
427
            import paddle.fluid as fluid
R
RaindragonD 已提交
428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458
            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 已提交
459 460 461 462 463 464 465 466 467 468 469

设置Pyreader对象的数据源。

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

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

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

R
RaindragonD 已提交
470
**代码示例**
Z
zy0531 已提交
471

R
RaindragonD 已提交
472 473
.. code-block:: python
            
X
xsrobin 已提交
474
            import paddle.fluid as fluid
R
RaindragonD 已提交
475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505
            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 已提交
506 507 508 509 510 511 512 513 514 515

设置Pyreader对象的数据源。

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

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

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

R
RaindragonD 已提交
517 518 519 520
**代码示例**

.. code-block:: python

X
xsrobin 已提交
521
            import paddle.fluid as fluid
R
RaindragonD 已提交
522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550
            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 已提交
551 552 553
.. _cn_api_fluid_io_save_inference_model:

save_inference_model
H
1207  
Hao Wang 已提交
554
-------------------------------
T
Tink_Y 已提交
555

R
RaindragonD 已提交
556
.. 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 已提交
557

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

H
Hao Wang 已提交
560 561

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

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


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

Z
zy0531 已提交
577 578 579
返回: 获取的变量名列表

返回类型:target_var_name_list(list)
T
Tink_Y 已提交
580 581 582 583 584 585 586

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

**代码示例**

R
RaindragonD 已提交
587 588 589
.. code-block:: python

    import paddle.fluid as fluid
T
Tink_Y 已提交
590 591 592

    path = "./infer_model"

R
RaindragonD 已提交
593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612
    # 用户定义网络,此处以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 已提交
613 614 615 616




H
1207  
Hao Wang 已提交
617 618 619



T
Tink_Y 已提交
620 621 622 623

.. _cn_api_fluid_io_save_params:

save_params
H
1207  
Hao Wang 已提交
624
-------------------------------
T
Tink_Y 已提交
625

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

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

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

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


参数:
 - **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 已提交
640
 - **filename**  (str|None) – 保存变量的文件。如果想分不同独立文件来保存变量,设置 filename=None. 默认值: None
T
Tink_Y 已提交
641 642 643 644 645
 
返回: None
  
**代码示例**

R
RaindragonD 已提交
646
.. code-block:: python
T
Tink_Y 已提交
647
    
X
xsrobin 已提交
648
    import paddle.fluid as fluid
T
Tink_Y 已提交
649 650 651 652 653 654 655 656
    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 已提交
657 658 659



T
Tink_Y 已提交
660 661 662 663

.. _cn_api_fluid_io_save_persistables:

save_persistables
H
1207  
Hao Wang 已提交
664
-------------------------------
T
Tink_Y 已提交
665

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

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

H
Hao Wang 已提交
670
``dirname`` 用于指定保存长期变量的目录。如果想将变量保存到指定目录的若干文件中,设置 ``filename=None`` ; 如果想将所有变量保存在一个文件中,请使用 ``filename`` 来指定它。
T
Tink_Y 已提交
671 672 673 674 675 676 677 678 679 680 681 682 683

参数:
 - **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 已提交
684
.. code-block:: python
T
Tink_Y 已提交
685
    
R
RaindragonD 已提交
686 687
    import paddle.fluid as fluid

T
Tink_Y 已提交
688 689 690
    exe = fluid.Executor(fluid.CPUPlace())
    param_path = "./my_paddle_model"
    prog = fluid.default_main_program()
Z
zy0531 已提交
691
    # `prog` 可以是由用户自定义的program
T
Tink_Y 已提交
692
    fluid.io.save_persistables(executor=exe, dirname=param_path,
Z
zy0531 已提交
693
                               main_program=prog)
T
Tink_Y 已提交
694 695 696 697
    
    


H
1207  
Hao Wang 已提交
698

T
Tink_Y 已提交
699 700 701 702 703 704



.. _cn_api_fluid_io_save_vars:

save_vars
H
1207  
Hao Wang 已提交
705
-------------------------------
T
Tink_Y 已提交
706

H
Hao Wang 已提交
707
.. py:function:: paddle.fluid.io.save_vars(executor, dirname, main_program=None, vars=None, predicate=None, filename=None)
T
Tink_Y 已提交
708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729

通过 ``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 已提交
730 731 732 733 734 735 736 737 738 739 740 741 742 743 744
.. 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 已提交
745 746 747 748 749 750 751
      param_path = "./my_paddle_model"

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

R
RaindragonD 已提交
752
      fluid.io.save_vars(executor=exe, dirname=param_path, main_program=main_prog, vars=None, predicate = name_has_fc)
T
Tink_Y 已提交
753 754 755 756 757
      # 将main_program中名中包含“fc”的的所有变量保存。
      # 变量将分开保存。


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


H
1207  
Hao Wang 已提交
766 767 768



T
Tink_Y 已提交
769