py_reader

    创建一个在Python端提供数据的reader

    该OP返回一个Reader Variable。该Reader提供了 decorate_paddle_reader()decorate_tensor_provider() 来设置Python generator作为数据源,将数据源中的数据feed到Reader Variable。在c++端调用 Executor::Run() 时,来自generator的数据将被自动读取。与 DataFeeder.feed() 不同,数据读取进程和 Executor::Run() 进程可以使用 py_reader 并行运行。在每次数据传递开始时调用reader的 start() ,在传递结束和抛出 fluid.core.EOFException 异常后执行 reset()

    注意: Program.clone() (含义详见 )不能克隆 py_reader ,且 read_fileread_file 含义详见 read_file )调用需在声明 py_reader 的program block内。

    参数:

    • shapes (list|tuple) – 一个列表或元组,shapes[i]是代表第i个数据shape,因此shape[i]也是元组或列表。

    • dtypes (list|tuple) – 一个string的列表或元组。为 shapes 对应元素的数据类型,支持bool,float16,float32,float64,int8,int16,int32,int64,uint8。

    • lod_levels (list|tuple) – lod_level的整型列表或元组

    • name (str,可选) – 具体用法请参见 ,一般无需设置,默认值为None。

    返回:reader,从reader中可以获取feed的数据,其dtype和feed的数据dtype相同。

    返回类型:Variable

    代码示例

    1.py_reader 基本用法如下

    1. import paddle
    2. import paddle.fluid as fluid
    3. import paddle.dataset.mnist as mnist
    4. def network(reader):
    5. img, label = fluid.layers.read_file(reader)
    6. # 用户自定义网络,此处以softmax回归为例
    7. predict = fluid.layers.fc(input=img, size=10, act='softmax')
    8. loss = fluid.layers.cross_entropy(input=predict, label=label)
    9. # 新建 train_main_prog 和 train_startup_prog
    10. train_main_prog = fluid.Program()
    11. train_startup_prog = fluid.Program()
    12. with fluid.program_guard(train_main_prog, train_startup_prog):
    13. # 使用 fluid.unique_name.guard() 实现与test program的参数共享
    14. train_reader = fluid.layers.py_reader(capacity=64,
    15. shapes=[(-1, 1, 28, 28), (-1, 1)],
    16. dtypes=['float32', 'int64'],
    17. name='train_reader')
    18. train_reader.decorate_paddle_reader(
    19. paddle.reader.shuffle(paddle.batch(mnist.train(),
    20. batch_size=5),
    21. buf_size=500))
    22. train_loss = network(train_reader) # 一些网络定义
    23. adam = fluid.optimizer.Adam(learning_rate=0.01)
    24. adam.minimize(train_loss)
    25. # Create test_main_prog and test_startup_prog
    26. test_main_prog = fluid.Program()
    27. test_startup_prog = fluid.Program()
    28. with fluid.program_guard(test_main_prog, test_startup_prog):
    29. # 使用 fluid.unique_name.guard() 实现与train program的参数共享
    30. with fluid.unique_name.guard():
    31. shapes=[(-1, 1, 28, 28), (-1, 1)],
    32. dtypes=['float32', 'int64'],
    33. name='test_reader')
    34. test_loss = network(test_reader)
    35. fluid.Executor(fluid.CUDAPlace(0)).run(train_startup_prog)
    36. fluid.Executor(fluid.CUDAPlace(0)).run(test_startup_prog)
    37. train_exe = fluid.ParallelExecutor(use_cuda=True,
    38. loss_name=train_loss.name, main_program=train_main_prog)
    39. test_exe = fluid.ParallelExecutor(use_cuda=True,
    40. loss_name=test_loss.name, main_program=test_main_prog)
    41. for epoch_id in range(10):
    42. train_reader.start()
    43. try:
    44. while True:
    45. train_exe.run(fetch_list=[train_loss.name])
    46. except fluid.core.EOFException:
    47. train_reader.reset()
    48. test_reader.start()
    49. try:
    50. while True:
    51. test_exe.run(fetch_list=[test_loss.name])