Data Converter for Python API
Created by: qingqing01
作用
在 https://github.com/PaddlePaddle/Paddle/pull/1345 里,我们描述了data reader机制。这个机制读取数据,并且输出Python的list类型或者numpy的Array类型的数据。在训练的时候,我们需要将这些数据转换为 PaddlePaddle API接口(目前为SWIG)可接受的数据类型。
主要两点:
- 每路数据按类型转换
- 多路数据输入顺序
C++数据结构
forward输入和输出的数据结构为Argument:
void MultiGradientMachine::forwardBackward(
const std::vector<Argument>& inArgs,
std::vector<Argument>* outArgs,
PassType passType,
const UpdateCallback& callback) {...}
Argument主要结构如下:
Argument {
MatrixPtr value; # Matrix or SparseMatrix
IVectorPtr ids;
IVectorPtr sequenceStartPositions;
}
- MatrixPtr value : Matrix or SparseMatrix
- dense_vector : 稠密矩阵
- sparse_non_value : 稀疏矩阵
- sparse_float: 稀疏带权矩阵
- IVectorPtr ids : 整数vector
- IVectorPtr sequenceStartPositions:整数vector
- 句子相关任务,和value、ids配合使用,指示每个样本在ids、value中的起始位置。
针对不同任务,数据类型不同,需要将其对应到C++数据结构中。
用法
paddle.train()里reader 产生多路输入数据
数据:minibatch_data = (column0, column1, column2, ...)
词典指示: {'image':0, 'label':1}
每列数据是一个特征的一个mini-batch的数据, 类型为Python类型, List 或者 Numpy Array等。
在forwardBackward之前,需要将数据转换为API接口暴露的数据(目前为swig_paddle.Arguments)。
用法:
converter = DataConverter(inputs)
arg = converter(minibatch_data, {'image':0, 'label':1})
目前C++里是通过类似Inputs('image', 'label')标识多路数据输入顺序,在数据转换里会按照此顺序存入API接口里。
DataConverter(inputs)中的inputs是从网络拓扑(topology)中获取的数据输入【顺序及类型】, 比如:
[('image', dense_vector(784)),
('label', integer_value(10))]
设计
-
各类型转换类:
- DenseConvert, SparseBinaryConvert, SparseFloatConvert, IndexConvert 转换不同的类型数据
- 填充Argument里的
MatrixPtr value 和 IVectorPtr ids
-
SequenceConvert
- 转换sequence数据,内嵌了上述4种类型转换,填充
IVectorPtr sequenceStartPositions
。
- 转换sequence数据,内嵌了上述4种类型转换,填充
-
DataConverter 用户接口,用法如上