准备数据的步骤
在 Paddle 静态图中,准备数据需要三步。
Step1. 自定义 Reader 生成数据
该步骤由用户自己定义一个数据读取方法,比如从一个指定的文件夹不断的加载图片。根据返回的数据形式不同,可分为 Sample 级和 Batch 级的 Reader。
Step2. 在网络中定义数据层变量
每个网络都需要输入数据,在 TensorFlow 中,使用 Placeholder
来定义输入数据,而在 Paddle 中,使用 fluid.data
来定义输入数据:
1 | from paddle import fluid |
Step3. 将数据送入网络进行训练
Paddle 支持两种数据读取方式,分别是异步数据读取和同步数据读取。
- 异步数据读取。先使用
fluid.io.DataLoader
定义 DataLoader 对象,然后给 DataLoader 对象设置数据源。使用 DataLoader 接口时,数据传入与模型训练过程是异步进行的,效率较高,推荐使用。 - 同步数据读取。用户自行构造输入数据,并使用
exe.run(feed=...)
传入训练数据。数据准备和模型训练的过程是同步进行的,效率较低。
两种 Reader 数据类型对应两种使用方式
用户自己定义的 Reader 可以是 Sample 级,也可以是 Batch 级,在使用时均需要传入 Batch 级的数据。
- Sample 级使用方式
- 若使用异步数据读取方式。则通过
set_sample_generator
或set_sample_list_generator
来设置数据源 - 若使用同步数据读取方式。首先通过
fluid.io.batch
将 Sample 级的 Reader 转为 Batch 级的 Reader,再使用fluid.DataFeeder
将数据转换为 Python 的字典
- 若使用异步数据读取方式。则通过
- Batch 级使用方式
- 若使用异步数据读取方式。则通过
set_batch_generator
来设置数据源 - 若使用同步数据读取方式。构建输入数据的字典将输入喂入模型
- 若使用异步数据读取方式。则通过
两种数据读取方式
异步数据读取
异步数据读取需要在定义完数据层变量后创建一个 DataLoader 对象:
1 | from paddle import fluid |
注:Program.clone()
不能实现 DataLoader 对象的复制。一般情况下,需重定义多个 DataLoader 对象,例如训练和测试阶段需要不同的 DataLoader 对象。
DataLoader对象通过 set_sample_generator()
, set_sample_list_generator
或 set_batch_generator()
方法设置其数据源。这三个方法均接收 Python 生成器 generator
作为参数,其区别在于:
set_sample_generator()
要求generator
返回的数据格式为 [sent_1, label_1],其中 sent_1 和 label_1 为单个样本的 Numpy Array 类型数据。set_sample_list_generator()
要求generator
返回的数据格式为 [(sent_1, label_1), (sent_2, label_2), …, (sent_n, label_n)],其中 sent_i 和 label_i 均为每个样本的 Numpy Array 类型数据,n 为 batch size。set_batch_generator()
要求generator
返回的数据的数据格式为 [batched_sents, batched_labels],其中 batched_sents 和 batched_labels 为 batch 级的 Numpy Array 或 LoDTensor 类型数据。
例子:
1 | from paddle import fluid |
同步数据读取
同步数据读取直接在运行时指定 feed
的参数为字典,字典的键为数据层变量名,值为 Numpy Array 或者 LoDTensor。当需要分别设置 ParallelExecutor 中每个设备的训练数据时,直接将一个列表传递给 feed
参数,列表内为若干个字典,每个字典对应每个设备上的数据。