|
| 1 | +################# |
| 2 | +Data Reader |
| 3 | +################# |
| 4 | + |
| 5 | + |
| 6 | +.. _cn_api_paddle_data_reader_datafeeder: |
| 7 | + |
| 8 | +DataFeeder |
| 9 | +================================== |
| 10 | + |
| 11 | +.. py:class:: paddle.fluid.data_feeder.DataFeeder(feed_list, place, program=None) |
| 12 | +
|
| 13 | +
|
| 14 | +DataFeeder将读卡器返回的数据转换为可以输入Executor和ParallelExecutor的数据结构。读卡器通常返回一个小批量数据条目列表。列表中的每个数据条目都是一个样本。每个样本都是具有一个或多个特征的列表或元组。 |
| 15 | + |
| 16 | +简单用法如下: |
| 17 | + |
| 18 | +**代码示例** |
| 19 | + |
| 20 | +.. code-block:: python |
| 21 | +
|
| 22 | + place = fluid.CPUPlace() |
| 23 | + img = fluid.layers.data(name='image', shape=[1, 28, 28]) |
| 24 | + label = fluid.layers.data(name='label', shape=[1], dtype='int64') |
| 25 | + feeder = fluid.DataFeeder([img, label], fluid.CPUPlace()) |
| 26 | + result = feeder.feed([([0] * 784, [9]), ([1] * 784, [1])]) |
| 27 | +
|
| 28 | +
|
| 29 | +如果您想在使用多个GPU训练模型时预先将数据单独输入GPU端,可以使用decorate_reader函数。 |
| 30 | + |
| 31 | + |
| 32 | +**代码示例** |
| 33 | + |
| 34 | +.. code-block:: python |
| 35 | +
|
| 36 | + place=fluid.CUDAPlace(0) |
| 37 | + feeder = fluid.DataFeeder(place=place, feed_list=[data, label]) |
| 38 | + reader = feeder.decorate_reader( |
| 39 | + paddle.batch(flowers.train(), batch_size=16)) |
| 40 | +
|
| 41 | +
|
| 42 | +参数: |
| 43 | + - **feed_list** (list) – 将输入模型的变量或变量的名称。 |
| 44 | + - **place** (Place) – place表示将数据输入CPU或GPU,如果要将数据输入GPU,请使用fluid.CUDAPlace(i)(i表示GPU的ID),如果要将数据输入CPU,请使用fluid.CPUPlace()。 |
| 45 | + - **program** (Program) –将数据输入的Program,如果Program为None,它将使用default_main_program() 。默认值None. |
| 46 | + |
| 47 | +抛出异常: ``ValueError`` – 如果某些变量未在Program中出现 |
| 48 | + |
| 49 | + |
| 50 | +**代码示例** |
| 51 | + |
| 52 | +.. code-block:: python |
| 53 | +
|
| 54 | + # ... |
| 55 | + place = fluid.CPUPlace() |
| 56 | + feed_list = [ |
| 57 | + main_program.global_block().var(var_name) for var_name in feed_vars_name |
| 58 | + ] # feed_vars_name is a list of variables' name. |
| 59 | + feeder = fluid.DataFeeder(feed_list, place) |
| 60 | + for data in reader(): |
| 61 | + outs = exe.run(program=main_program, |
| 62 | + feed=feeder.feed(data)) |
| 63 | +
|
| 64 | +
|
| 65 | +
|
| 66 | +.. py:method:: feed(iterable) |
| 67 | +
|
| 68 | +根据feed_list和iterable,将输入转换成一个数据结构,该数据结构可以输入Executor和ParallelExecutor。 |
| 69 | + |
| 70 | +参数: |
| 71 | + - **iterable** (list|tuple) – 输入的数据 |
| 72 | + |
| 73 | +返回: 转换结果 |
| 74 | + |
| 75 | +返回类型: dict |
| 76 | + |
| 77 | + |
| 78 | + |
| 79 | +.. py:method:: feed_parallel(iterable, num_places=None) |
| 80 | +
|
| 81 | +需要多个mini-batches。每个mini-batch都将提前在每个设备上输入。 |
| 82 | + |
| 83 | +参数: |
| 84 | + - **iterable** (list|tuple) – 输入的数据 |
| 85 | + - **num_places** (int) – 设备编号,默认值为None。 |
| 86 | + |
| 87 | +返回: 转换结果 |
| 88 | + |
| 89 | +返回类型: dict |
| 90 | + |
| 91 | + |
| 92 | + |
| 93 | +.. note:: |
| 94 | + |
| 95 | + 设备数量和mini-batches数量必须一致。 |
| 96 | + |
| 97 | +.. py:method:: decorate_reader(reader, multi_devices, num_places=None, drop_last=True) |
| 98 | +
|
| 99 | +将输入数据转换成读卡器返回的多个mini-batches。每个mini-batch |
| 100 | + |
| 101 | +参数: |
| 102 | + - **reader** (function) – reader是可以生成数据的函数 |
| 103 | + - **multi_devices** (bool) – 是否用多个设备 |
| 104 | + - **num_places** (int) – 如果multi_devices是True, 你可以指定GPU的使用数量, 如果multi_devices是None, 会使用当前机器的所有GPU ,默认值None。 |
| 105 | + - **drop_last** (bool) – 如果最后一个batch的大小小于batch_size,是否删除最后一个batch,默认值True。 |
| 106 | + |
| 107 | +返回: 转换结果 |
| 108 | + |
| 109 | +返回类型: dict |
| 110 | + |
| 111 | +引起异常: ValueError – 如果drop_last为False并且数据批不适合设备。 |
| 112 | + |
| 113 | + |
| 114 | +.. _cn_api_paddle_data_reader_reader: |
| 115 | + |
| 116 | +Reader |
| 117 | +================================== |
| 118 | + |
| 119 | +在训练和测试时,PaddlePaddle需要读取数据。为了简化用户编写数据读取代码的工作,我们定义了 |
| 120 | + |
| 121 | + - reader是一个读取数据(从文件、网络、随机数生成器等)并生成数据项的函数。 |
| 122 | + - reader creator是返回reader函数的函数。 |
| 123 | + - reader decorator是一个函数,它接受一个或多个读卡器,并返回一个读卡器。 |
| 124 | + - batch reader是一个函数,它读取数据(从读卡器、文件、网络、随机数生成器等)并生成一批数据项。 |
| 125 | + |
| 126 | + |
| 127 | +Data Reader Interface |
| 128 | +------------------------------------ |
| 129 | + |
| 130 | +的确,数据阅读器不必是读取和生成数据项的函数,它可以是任何不带参数的函数来创建一个iterable(任何东西都可以被用于 ``for x in iterable`` ): |
| 131 | + |
| 132 | +.. code-block:: python |
| 133 | +
|
| 134 | + iterable = data_reader() |
| 135 | +
|
| 136 | +从iterable生成的元素应该是单个数据条目,而不是mini batch。数据输入可以是单个项目,也可以是项目的元组,但应为 `支持的类型 <http://www.paddlepaddle.org/doc/ui/data_provider/pydataprovider2.html?highlight=dense_vector#input-types>`_ (如, numpy 1d array of float32, int, list of int) |
| 137 | + |
| 138 | + |
| 139 | +单项目数据读取器创建者的示例实现: |
| 140 | + |
| 141 | +.. code-block:: python |
| 142 | +
|
| 143 | + def reader_creator_random_image(width, height): |
| 144 | + def reader(): |
| 145 | + while True: |
| 146 | + yield numpy.random.uniform(-1, 1, size=width*height) |
| 147 | + return reader |
| 148 | +
|
| 149 | +
|
| 150 | +多项目数据读取器创建者的示例实现: |
| 151 | + |
| 152 | +.. code-block:: python |
| 153 | +
|
| 154 | + def reader_creator_random_image_and_label(width, height, label): |
| 155 | + def reader(): |
| 156 | + while True: |
| 157 | + yield numpy.random.uniform(-1, 1, size=width*height), label |
| 158 | + return reader |
| 159 | +
|
| 160 | +.. py:function:: paddle.reader.map_readers(func, *readers) |
| 161 | +
|
| 162 | +创建使用每个数据读取器的输出作为参数输出函数返回值的数据读取器。 |
| 163 | + |
| 164 | +参数: |
| 165 | + - **func** - 使用的函数. 函数类型应为(Sample) => Sample |
| 166 | + - **readers** - 其输出将用作func参数的读卡器。 |
| 167 | + |
| 168 | +类型:callable |
| 169 | + |
| 170 | +返回: 被创建数据的读取器 |
| 171 | + |
| 172 | +返回类型: callable |
| 173 | + |
| 174 | + |
| 175 | +.. py:function:: paddle.reader.buffered(reader, size) |
| 176 | +
|
| 177 | +创建缓冲数据读取器。 |
| 178 | + |
| 179 | +缓冲数据读卡器将读取数据条目并将其保存到缓冲区中。只要缓冲区不为空,就将继续从缓冲数据读取器读取数据。 |
| 180 | + |
| 181 | +参数: |
| 182 | + - **reader** (callable) - 要读取的数据读取器 |
| 183 | + - **size** (int) - 最大缓冲 |
| 184 | + |
| 185 | + |
| 186 | +返回:缓冲数据的读取器 |
| 187 | + |
| 188 | + |
| 189 | +.. py:function:: paddle.reader.compose(*readers, **kwargs) |
| 190 | +
|
| 191 | +创建一个数据读卡器,其输出是输入读卡器的组合。 |
| 192 | + |
| 193 | +如果输入读卡器输出以下数据项:(1,2)3(4,5),则组合读卡器将输出:(1,2,3,4,5) |
| 194 | + |
| 195 | +参数: |
| 196 | + - **readers** - 将被组合的多个读取器 |
| 197 | + - **check_alignment** (bool) - 如果为True,将检查输入读卡器是否正确对齐。如果为False,将不检查对齐,将丢弃跟踪输出。默认值True。 |
| 198 | + |
| 199 | +返回:新的数据读取器 |
| 200 | + |
| 201 | +引起异常: ``ComposeNotAligned`` – 读卡器的输出不一致。 当check_alignment设置为False,不会升高。 |
| 202 | + |
| 203 | + |
| 204 | + |
| 205 | +.. py:function:: paddle.reader.chain(*readers) |
| 206 | +
|
| 207 | +创建一个数据读卡器,其输出是链接在一起的输入数据读卡器的输出。 |
| 208 | + |
| 209 | +如果输入读卡器输出以下数据条目:[0,0,0][1,1,1][2,2,2],链接读卡器将输出:[0,0,0,1,1,1,2,2,2] |
| 210 | + |
| 211 | +参数: |
| 212 | + - **readers** – 输入的数据 |
| 213 | + |
| 214 | +返回: 新的数据读取器 |
| 215 | + |
| 216 | +返回类型: callable |
| 217 | + |
| 218 | + |
| 219 | +.. py:function:: paddle.reader.shuffle(reader, buf_size) |
| 220 | +
|
| 221 | +创建数据读取器,该阅读器的数据输出将被无序排列。 |
| 222 | + |
| 223 | +由原始读卡器创建的迭代器的输出将被缓冲到shuffle缓冲区,然后进行打乱。打乱缓冲区的大小由参数buf_size决定。 |
| 224 | + |
| 225 | +参数: |
| 226 | + - **reader** (callable) – 输出会被打乱的原始读卡器 |
| 227 | + - **buf_size** (int) – 打乱缓冲器的大小 |
| 228 | + |
| 229 | +返回: 输出会被打乱的读卡器 |
| 230 | + |
| 231 | +返回类型: callable |
| 232 | + |
| 233 | + |
| 234 | + |
| 235 | +.. py:function:: paddle.reader.firstn(reader, n) |
| 236 | +
|
| 237 | +限制读卡器可以返回的最大样本数。 |
| 238 | + |
| 239 | +参数: |
| 240 | + - **reader** (callable) – 要读取的数据读取器 |
| 241 | + - **n** (int) – 返回的最大样本数 |
| 242 | + |
| 243 | +返回: 装饰读卡器 |
| 244 | + |
| 245 | +返回类型: callable |
| 246 | + |
| 247 | + |
| 248 | + |
| 249 | + |
| 250 | +.. py:function:: paddle.reader.xmap_readers(mapper, reader, process_num, buffer_size, order=False) |
| 251 | +
|
| 252 | +
|
| 253 | +
|
| 254 | +.. py:class:: paddle.reader.PipeReader(command, bufsize=8192, file_type='plain') |
| 255 | +
|
| 256 | +
|
| 257 | +PipeReader通过流从一个命令中读取数据,将它的stdout放到管道缓冲区中,并将其重定向到解析器进行解析,然后根据需要的格式生成数据。 |
| 258 | + |
| 259 | + |
| 260 | +您可以使用标准Linux命令或调用其他Program来读取数据,例如通过HDFS、CEPH、URL、AWS S3中读取: |
| 261 | + |
| 262 | +**代码示例** |
| 263 | + |
| 264 | +.. code-block:: python |
| 265 | +
|
| 266 | + def example_reader(): |
| 267 | + for f in myfiles: |
| 268 | + pr = PipeReader("cat %s"%f) |
| 269 | + for l in pr.get_line(): |
| 270 | + sample = l.split(" ") |
| 271 | + yield sample |
| 272 | +
|
| 273 | +
|
| 274 | +.. py:method:: get_line(cut_lines=True, line_break='\n') |
| 275 | +
|
| 276 | +param cut_lines: |
| 277 | + cut buffer to lines |
| 278 | + |
| 279 | +type cut_lines: bool |
| 280 | + |
| 281 | +param line_break: |
| 282 | + line break of the file, like |
| 283 | + |
| 284 | +or |
| 285 | + |
| 286 | +type line_break: |
| 287 | + string |
| 288 | + |
| 289 | +return: one line or a buffer of bytes |
| 290 | + |
| 291 | +rtype: string |
| 292 | + |
| 293 | + |
| 294 | + |
| 295 | +.. py:function:: paddle.reader.multiprocess_reader(readers, use_pipe=True, queue_size=1000) |
| 296 | +
|
| 297 | +多进程读卡器使用python多进程从读卡器中读取数据,然后使用multi process.queue或multi process.pipe合并所有数据。进程号等于输入读卡器的编号,每个进程调用一个读卡器。 |
| 298 | + |
| 299 | +multiprocess.queue需要/dev/shm的rw访问权限,某些平台不支持。 |
| 300 | + |
| 301 | +您需要首先创建多个读卡器,这些读卡器应该相互独立,这样每个进程都可以独立工作。 |
| 302 | + |
| 303 | +**代码示例** |
| 304 | + |
| 305 | +.. code-block:: python |
| 306 | +
|
| 307 | + reader0 = reader(["file01", "file02"]) |
| 308 | + reader1 = reader(["file11", "file12"]) |
| 309 | + reader1 = reader(["file21", "file22"]) |
| 310 | + reader = multiprocess_reader([reader0, reader1, reader2], |
| 311 | + queue_size=100, use_pipe=False) |
| 312 | +
|
| 313 | +
|
| 314 | +
|
| 315 | +.. py:class::paddle.reader.Fake |
| 316 | +
|
| 317 | +Fake读卡器将缓存它读取的第一个数据,并将其输出data_num次。它用于缓存来自真实阅读器的数据,并将其用于速度测试。 |
| 318 | + |
| 319 | +参数: |
| 320 | + - **reader** – 原始读取器 |
| 321 | + - **data_num** – 读卡器产生数据的次数 |
| 322 | + |
| 323 | +返回: 一个Fake读取器 |
| 324 | + |
| 325 | + |
| 326 | +**代码示例** |
| 327 | + |
| 328 | +.. code-block:: python |
| 329 | +
|
| 330 | + def reader(): |
| 331 | + for i in range(10): |
| 332 | + yield i |
| 333 | +
|
| 334 | + fake_reader = Fake()(reader, 100) |
| 335 | +
|
| 336 | +
|
| 337 | +Creator包包含一些简单的reader creator,可以在用户Program中使用。 |
| 338 | + |
| 339 | + |
| 340 | + |
| 341 | +.. py:function:: paddle.reader.creator.np_array(x) |
| 342 | +
|
| 343 | +如果是numpy向量,则创建一个生成x个元素的读取器。或者,如果它是一个numpy矩阵,创建一个生成x行元素的读取器。或由最高维度索引的任何子超平面。 |
| 344 | + |
| 345 | +参数: |
| 346 | + - **x** – 用于创建读卡器的numpy数组 |
| 347 | + |
| 348 | +返回: 从x创建的数据读取器 |
| 349 | + |
| 350 | + |
| 351 | +.. py:function:: paddle.reader.creator.text_file(path) |
| 352 | +
|
| 353 | +创建从给定文本文件逐行输出文本的数据读取器。将删除每行的行尾的(‘\n’)。 |
| 354 | + |
| 355 | +路径:文本文件的路径 |
| 356 | + |
| 357 | +返回: 文本文件的数据读取器 |
| 358 | + |
| 359 | + |
| 360 | +.. py:function:: paddle.reader.creator.recordio(paths, buf_size=100) |
| 361 | +
|
| 362 | +从给定的recordio文件路径创建数据读卡器,用“,”分隔“,支持全局模式。 |
| 363 | + |
| 364 | +路径:recordio文件的路径,可以是字符串或字符串列表。 |
| 365 | + |
| 366 | +返回: recordio文件的数据读取器 |
0 commit comments