data_reader_cn.rst 14.6 KB
Newer Older
Z
zy0531 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13
#################
Data Reader
#################


.. _cn_api_paddle_data_reader_datafeeder:

DataFeeder
==================================

.. py:class:: paddle.fluid.data_feeder.DataFeeder(feed_list, place, program=None)


14
DataFeeder将reader返回的数据转换为可以输入Executor和ParallelExecutor的数据结构。reader通常返回一个小批量数据条目列表。列表中的每个数据条目都是一个样本。每个样本都是具有一个或多个特征的列表或元组。
Z
zy0531 已提交
15 16 17 18 19 20 21

简单用法如下:

**代码示例**

..  code-block:: python

R
RaindragonD 已提交
22 23 24 25 26 27
    import paddle.fluid as fluid
    place = fluid.CPUPlace()
    img = fluid.layers.data(name='image', shape=[1, 28, 28])
    label = fluid.layers.data(name='label', shape=[1], dtype='int64')
    feeder = fluid.DataFeeder([img, label], fluid.CPUPlace())
    result = feeder.feed([([0] * 784, [9]), ([1] * 784, [1])])
Z
zy0531 已提交
28 29


30
如果您想在使用多个GPU训练模型时预先将数据单独输入GPU端,可以使用decorate_reader函数。
Z
zy0531 已提交
31 32 33 34 35 36


**代码示例**

..  code-block:: python

R
RaindragonD 已提交
37 38 39 40 41 42 43 44 45 46
    import paddle
    import paddle.fluid as fluid
    
    place=fluid.CUDAPlace(0)
    data = fluid.layers.data(name='data', shape=[3, 224, 224], dtype='float32')
    label = fluid.layers.data(name='label', shape=[1], dtype='int64')
    
    feeder = fluid.DataFeeder(place=place, feed_list=[data, label])
    reader = feeder.decorate_reader(
        paddle.batch(paddle.dataset.flowers.train(), batch_size=16), multi_devices=False)
Z
zy0531 已提交
47 48 49 50 51


参数:
    - **feed_list**  (list) –  将输入模型的变量或变量的名称。
    - **place**  (Place) – place表示将数据输入CPU或GPU,如果要将数据输入GPU,请使用fluid.CUDAPlace(i)(i表示GPU的ID),如果要将数据输入CPU,请使用fluid.CPUPlace()。
52
    - **program**  (Program) –将数据输入的Program,如果Program为None,它将使用default_main_program() 。默认值None。
Z
zy0531 已提交
53

R
RaindragonD 已提交
54
抛出异常:     ``ValueError`` – 如果某些变量未在Program中出现
Z
zy0531 已提交
55 56 57 58 59 60


**代码示例**

..  code-block:: python

R
RaindragonD 已提交
61 62 63
    import numpy as np
    import paddle
    import paddle.fluid as fluid
Z
zy0531 已提交
64

R
RaindragonD 已提交
65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
    place = fluid.CPUPlace()

    def reader():
        yield [np.random.random([4]).astype('float32'), np.random.random([3]).astype('float32')],

    main_program = fluid.Program()
    startup_program = fluid.Program()

    with fluid.program_guard(main_program, startup_program):
        data_1 = fluid.layers.data(name='data_1', shape=[1, 2, 2])
        data_2 = fluid.layers.data(name='data_2', shape=[1, 1, 3])
        out = fluid.layers.fc(input=[data_1, data_2], size=2)
        # ...

    feeder = fluid.DataFeeder([data_1, data_2], place)

    exe = fluid.Executor(place)
    exe.run(startup_program)
    for data in reader():
        outs = exe.run(program=main_program,
                       feed=feeder.feed(data),
                       fetch_list=[out])
Z
zy0531 已提交
87 88 89 90 91 92 93 94 95 96 97 98 99


.. py:method::  feed(iterable)

根据feed_list和iterable,将输入转换成一个数据结构,该数据结构可以输入Executor和ParallelExecutor。

参数:
    - **iterable** (list|tuple) – 输入的数据

返回: 转换结果

返回类型: dict

R
RaindragonD 已提交
100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117
**代码示例**

..  code-block:: python

        import numpy.random as random
        import paddle.fluid as fluid
        
        def reader(limit=5):
            for i in range(limit):
                    yield random.random([784]).astype('float32'), random.random([1]).astype('int64'), random.random([256]).astype('float32')
        
        data_1 = fluid.layers.data(name='data_1', shape=[1, 28, 28])
        data_2 = fluid.layers.data(name='data_2', shape=[1], dtype='int64')
        data_3 = fluid.layers.data(name='data_3', shape=[16, 16], dtype='float32')
        feeder = fluid.DataFeeder(['data_1','data_2', 'data_3'], fluid.CPUPlace())
        
        result = feeder.feed(reader())

Z
zy0531 已提交
118 119 120 121 122 123 124


.. py:method::  feed_parallel(iterable, num_places=None)

需要多个mini-batches。每个mini-batch都将提前在每个设备上输入。

参数:
125
    - **iterable** (list|tuple) – 输入的数据。
Z
zy0531 已提交
126 127 128 129 130 131 132 133
    - **num_places**  (int) – 设备编号,默认值为None。

返回: 转换结果

返回类型: dict



134
.. note::
Z
zy0531 已提交
135

R
RaindragonD 已提交
136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164
    设备数量和mini-batches数量必须一致。

**代码示例**

..  code-block:: python

        import numpy.random as random
        import paddle.fluid as fluid
        
        def reader(limit=10):
            for i in range(limit):
                yield [random.random([784]).astype('float32'), random.randint(10)],
        
        x = fluid.layers.data(name='x', shape=[1, 28, 28])
        y = fluid.layers.data(name='y', shape=[1], dtype='int64')
        
        feeder = fluid.DataFeeder(['x','y'], fluid.CPUPlace())
        place_num = 2
        places = [fluid.CPUPlace() for x in range(place_num)]
        data = []
        exe = fluid.Executor(fluid.CPUPlace())
        exe.run(fluid.default_startup_program())
        program = fluid.CompiledProgram(fluid.default_main_program()).with_data_parallel(places=places)
        for item in reader():
            data.append(item)
            if place_num == len(data):
                exe.run(program=program, feed=list(feeder.feed_parallel(data, place_num)), fetch_list=[])
                data = []

Z
zy0531 已提交
165 166 167

.. py:method::  decorate_reader(reader, multi_devices, num_places=None, drop_last=True)

168
将输入数据转换成reader返回的多个mini-batches。每个mini-batch分别送入各设备中。
Z
zy0531 已提交
169 170

参数:
171 172
    - **reader** (function) – reader是可以生成数据的函数。
    - **multi_devices** (bool) – 是否用多个设备。
Z
zy0531 已提交
173
    - **num_places** (int) – 如果multi_devices是True, 你可以指定GPU的使用数量, 如果multi_devices是None, 会使用当前机器的所有GPU ,默认值None。
174
    - **drop_last** (bool) – 如果最后一个batch的大小小于batch_size,选择是否删除最后一个batch,默认值True。
Z
zy0531 已提交
175 176 177 178 179

返回: 转换结果

返回类型: dict

R
RaindragonD 已提交
180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205
抛出异常:     ``ValueError`` – 如果drop_last为False并且数据batch和设备数目不匹配。

**代码示例**

..  code-block:: python

        import numpy.random as random
        import paddle
        import paddle.fluid as fluid
        
        def reader(limit=5):
            for i in range(limit):
                yield (random.random([784]).astype('float32'), random.random([1]).astype('int64')),
        
        place=fluid.CUDAPlace(0)
        data = fluid.layers.data(name='data', shape=[1, 28, 28], dtype='float32')
        label = fluid.layers.data(name='label', shape=[1], dtype='int64')
        
        feeder = fluid.DataFeeder(place=place, feed_list=[data, label])
        reader = feeder.decorate_reader(reader, multi_devices=False)
        
        exe = fluid.Executor(place)
        exe.run(fluid.default_startup_program())
        for data in reader():
            exe.run(feed=data)

Z
zy0531 已提交
206 207 208 209 210 211 212 213 214


.. _cn_api_paddle_data_reader_reader:

Reader
==================================

在训练和测试时,PaddlePaddle需要读取数据。为了简化用户编写数据读取代码的工作,我们定义了

R
RaindragonD 已提交
215 216 217 218
    - reader是一个读取数据(从文件、网络、随机数生成器等)并生成数据项的函数。
    - reader creator是返回reader函数的函数。
    - reader decorator是一个函数,它接受一个或多个reader,并返回一个reader。
    - batch reader是一个函数,它读取数据(从reader、文件、网络、随机数生成器等)并生成一批数据项。
Z
zy0531 已提交
219 220 221 222 223


Data Reader Interface
------------------------------------

224
的确,data reader不必是读取和生成数据项的函数,它可以是任何不带参数的函数来创建一个iterable(任何东西都可以被用于 ``for x in iterable`` ):
Z
zy0531 已提交
225 226 227

..  code-block:: python

R
RaindragonD 已提交
228
    iterable = data_reader()
Z
zy0531 已提交
229

A
acosta123 已提交
230
从iterable生成的元素应该是单个数据条目,而不是mini batch。数据输入可以是单个项目,也可以是项目的元组,但应为 :ref:`user_guide_paddle_support_data_types` (如, numpy 1d array of float32, int, list of int)
Z
zy0531 已提交
231 232


233
单项目数据读取器创建者的示例实现:
Z
zy0531 已提交
234 235 236

..  code-block:: python

R
RaindragonD 已提交
237 238 239 240 241
    def reader_creator_random_image(width, height):
        def reader():
            while True:
                yield numpy.random.uniform(-1, 1, size=width*height)
    return reader
Z
zy0531 已提交
242 243


244
多项目数据读取器创建者的示例实现:
Z
zy0531 已提交
245 246 247

..  code-block:: python

R
RaindragonD 已提交
248 249 250 251 252
    def reader_creator_random_image_and_label(width, height, label):
        def reader():
            while True:
                yield numpy.random.uniform(-1, 1, size=width*height), label
    return reader
Z
zy0531 已提交
253 254 255 256 257 258 259

.. py:function::   paddle.reader.map_readers(func, *readers)

创建使用每个数据读取器的输出作为参数输出函数返回值的数据读取器。

参数:
    - **func**  - 使用的函数. 函数类型应为(Sample) => Sample
260
    - **readers**  - 其输出将用作func参数的reader。
Z
zy0531 已提交
261 262 263 264 265 266 267 268 269 270 271 272

类型:callable

返回: 被创建数据的读取器

返回类型: callable


.. py:function::  paddle.reader.buffered(reader, size)

创建缓冲数据读取器。

273
缓冲数据reader将读取数据条目并将其保存到缓冲区中。只要缓冲区不为空,就将继续从缓冲数据读取器读取数据。
Z
zy0531 已提交
274 275 276 277 278 279 280 281 282 283 284

参数:
    - **reader** (callable) - 要读取的数据读取器
    - **size** (int) - 最大缓冲


返回:缓冲数据的读取器


.. py:function::   paddle.reader.compose(*readers, **kwargs)

285
创建一个数据reader,其输出是输入reader的组合。
Z
zy0531 已提交
286

287
如果输入reader输出以下数据项:(1,2)3(4,5),则组合reader将输出:(1,2,3,4,5)。
Z
zy0531 已提交
288 289

参数:
290
    - **readers** - 将被组合的多个读取器。
291
    - **check_alignment** (bool) - 如果为True,将检查输入reader是否正确对齐。如果为False,将不检查对齐,将丢弃跟踪输出。默认值True。
Z
zy0531 已提交
292 293 294

返回:新的数据读取器

R
RaindragonD 已提交
295
抛出异常:     ``ComposeNotAligned`` – reader的输出不一致。 当check_alignment设置为False,不会升高。
Z
zy0531 已提交
296 297 298 299 300



.. py:function:: paddle.reader.chain(*readers)

301
创建一个数据reader,其输出是链接在一起的输入数据reader的输出。
Z
zy0531 已提交
302

303
如果输入reader输出以下数据条目:[0,0,0][1,1,1][2,2,2],链接reader将输出:[0,0,0,1,1,1,2,2,2] 。
Z
zy0531 已提交
304 305

参数:
306
    - **readers** – 输入的数据。
Z
zy0531 已提交
307 308 309 310 311 312 313 314

返回: 新的数据读取器

返回类型: callable


.. py:function:: paddle.reader.shuffle(reader, buf_size)

315
创建数据读取器,该reader的数据输出将被无序排列。
Z
zy0531 已提交
316

317
由原始reader创建的迭代器的输出将被缓冲到shuffle缓冲区,然后进行打乱。打乱缓冲区的大小由参数buf_size决定。
Z
zy0531 已提交
318 319

参数:
320
    - **reader** (callable)  – 输出会被打乱的原始reader
Z
zy0531 已提交
321 322
    - **buf_size** (int)  – 打乱缓冲器的大小

323
返回: 输出会被打乱的reader
Z
zy0531 已提交
324 325 326 327 328 329 330

返回类型: callable



.. py:function:: paddle.reader.firstn(reader, n)

331
限制reader可以返回的最大样本数。
Z
zy0531 已提交
332 333

参数:
334 335
    - **reader** (callable)  – 要读取的数据读取器。
    - **n** (int)  – 返回的最大样本数 。
Z
zy0531 已提交
336

337
返回: 装饰reader
Z
zy0531 已提交
338 339 340 341 342 343 344 345

返回类型: callable




.. py:function:: paddle.reader.xmap_readers(mapper, reader, process_num, buffer_size, order=False)

H
Hao Wang 已提交
346
通过多线程方式,通过用户自定义的映射器mapper来映射reader返回的样本(到输出队列)。
Z
zy0531 已提交
347

H
Hao Wang 已提交
348 349 350 351 352 353 354 355 356 357
参数:
    - **mapper** (callable) - 一种映射reader数据的函数。
    - **reader** (callable) - 产生数据的reader。
    - **process_num** (int) - 用于处理样本的线程数目。
    - **buffer_size** (int) - 存有待读取数据的队列的大小。
    - **order** (bool) - 是否保持原始reader的数据顺序。 默认为False。

返回:一个将原数据进行映射后的decorated reader。

返回类型: callable
Z
zy0531 已提交
358 359 360 361 362 363 364

.. py:class:: paddle.reader.PipeReader(command, bufsize=8192, file_type='plain')


PipeReader通过流从一个命令中读取数据,将它的stdout放到管道缓冲区中,并将其重定向到解析器进行解析,然后根据需要的格式生成数据。


365
您可以使用标准Linux命令或调用其他Program来读取数据,例如通过HDFS、CEPH、URL、AWS S3中读取:
Z
zy0531 已提交
366 367 368 369 370

**代码示例**

..  code-block:: python

R
RaindragonD 已提交
371 372 373 374 375 376
    def example_reader():
        for f in myfiles:
            pr = PipeReader("cat %s"%f)
            for l in pr.get_line():
                sample = l.split(" ")
                yield sample
Z
zy0531 已提交
377 378 379 380 381


.. py:method:: get_line(cut_lines=True, line_break='\n')

param cut_lines:
R
RaindragonD 已提交
382
     cut buffer to lines
Z
zy0531 已提交
383

R
RaindragonD 已提交
384
type cut_lines:    bool
Z
zy0531 已提交
385 386

param line_break:
R
RaindragonD 已提交
387
     line break of the file, like
Z
zy0531 已提交
388 389 390 391

or

type line_break:
R
RaindragonD 已提交
392
     string
Z
zy0531 已提交
393

R
RaindragonD 已提交
394
return:    one line or a buffer of bytes
Z
zy0531 已提交
395

R
RaindragonD 已提交
396
rtype:    string
Z
zy0531 已提交
397 398 399 400 401



.. py:function:: paddle.reader.multiprocess_reader(readers, use_pipe=True, queue_size=1000)

402
多进程reader使用python多进程从reader中读取数据,然后使用multi process.queue或multi process.pipe合并所有数据。进程号等于输入reader的编号,每个进程调用一个reader。
Z
zy0531 已提交
403 404 405

multiprocess.queue需要/dev/shm的rw访问权限,某些平台不支持。

406
您需要首先创建多个reader,这些reader应该相互独立,这样每个进程都可以独立工作。
Z
zy0531 已提交
407 408 409 410 411

**代码示例**

..  code-block:: python

R
RaindragonD 已提交
412 413 414 415 416
    reader0 = reader(["file01", "file02"])
    reader1 = reader(["file11", "file12"])
    reader1 = reader(["file21", "file22"])
    reader = multiprocess_reader([reader0, reader1, reader2],
        queue_size=100, use_pipe=False)
Z
zy0531 已提交
417 418 419 420 421



.. py:class::paddle.reader.Fake

422
Fakereader将缓存它读取的第一个数据,并将其输出data_num次。它用于缓存来自真实reader的数据,并将其用于速度测试。
Z
zy0531 已提交
423 424

参数:
425 426
    - **reader** – 原始读取器。
    - **data_num** – reader产生数据的次数 。
Z
zy0531 已提交
427 428 429 430 431 432 433 434

返回: 一个Fake读取器


**代码示例**

..  code-block:: python

R
RaindragonD 已提交
435 436 437
    def reader():
        for i in range(10):
            yield i
Z
zy0531 已提交
438

R
RaindragonD 已提交
439
    fake_reader = Fake()(reader, 100)
Z
zy0531 已提交
440 441 442 443 444 445 446 447


Creator包包含一些简单的reader creator,可以在用户Program中使用。



.. py:function:: paddle.reader.creator.np_array(x)

448
如果是numpy向量,则创建一个生成x个元素的读取器。或者,如果它是一个numpy矩阵,创建一个生成x行元素的读取器。或由最高维度索引的任何子超平面。
Z
zy0531 已提交
449 450

参数:
451
    - **x** – 用于创建reader的numpy数组。
Z
zy0531 已提交
452 453 454 455 456 457 458 459 460 461 462 463 464 465 466

返回: 从x创建的数据读取器


.. py:function:: paddle.reader.creator.text_file(path)

创建从给定文本文件逐行输出文本的数据读取器。将删除每行的行尾的(‘\n’)。

路径:文本文件的路径

返回: 文本文件的数据读取器


.. py:function::  paddle.reader.creator.recordio(paths, buf_size=100)

467
从给定的recordio文件路径创建数据reader,用“,”分隔“,支持全局模式。
Z
zy0531 已提交
468 469 470

路径:recordio文件的路径,可以是字符串或字符串列表。

R
RaindragonD 已提交
471
返回:recordio文件的数据读取器