PaddlePaddle的Python预测接口

PaddlePaddle目前使用Swig对其常用的预测接口进行了封装,使在Python环境下的预测接口更加简单。 在Python环境下预测结果,主要分为以下几个步骤。

  • 读入解析训练配置
  • 构造GradientMachine
  • 准备数据
  • 预测

典型的预测代码如下,使用mnist手写识别作为样例, 完整代码见 src_root/doc/ui/predict/predict_sample.py

from py_paddle import swig_paddle, DataProviderConverter
from paddle.trainer.PyDataProvider2 import dense_vector
from paddle.trainer.config_parser import parse_config


def main():
    conf = parse_config("./mnist_model/trainer_config.py", "")
    print conf.data_config.load_data_args
    network = swig_paddle.GradientMachine.createFromConfigProto(conf.model_config)
    assert isinstance(network, swig_paddle.GradientMachine)  # For code hint.
    network.loadParameters("./mnist_model/")
    converter = DataProviderConverter([dense_vector(784)])
    inArg = converter(TEST_DATA)
    print network.forwardTest(inArg)


if __name__ == '__main__':
    swig_paddle.initPaddle("--use_gpu=0")
    main()

主要的软件包为py_paddle.swig_paddle,这个软件包文档相对完善。可以使用python的 help() 函数查询文档。主要步骤为:

  • 在程序开始阶段,使用 swig_paddle.initPaddle() 传入命令行参数初始化 PaddlePaddle。详细的命令行参数请参考 命令行参数

  • 接下来使用 parse_config() 解析训练时的配置文件。这里要注意预测数据通常 不包含label, 而且预测网络通常直接输出最后一层的结果而不是像训练时一样以cost layer作为输出,所以用于预测的配置文件要做相应的修改。

  • 使用 swig_paddle.GradientMachine.createFromConfigproto() 根据上一步解 析好的配置创建神经网络。

  • 创建一个 DataProviderConverter 对象converter。
    • swig_paddle接受的原始数据是C++的Matrix,也就是直接写内存的float数组。 这个接口并不用户友好。所以,我们提供了一个工具类DataProviderConverter。 这个工具类接收和PyDataProvider2一样的输入数据,详情请参考 PyDataProvider2文档
  • 最后使用 forwardTest() 直接提取出神经网络Output层的输出结果。典型的输出结果为:

[{'id': None, 'value': array([[  5.53018653e-09,   1.12194102e-05,   1.96644767e-09,
      1.43630644e-02,   1.51111044e-13,   9.85625684e-01,
      2.08823112e-10,   2.32777140e-08,   2.00186201e-09,
      1.15501715e-08],
   [  9.99982715e-01,   1.27787406e-10,   1.72296313e-05,
      1.49316648e-09,   1.36540484e-11,   6.93137714e-10,
      2.70634608e-08,   3.48565123e-08,   5.25639710e-09,
      4.48684503e-08]], dtype=float32)}]

其中,value即为softmax层的输出。由于数据是两条,所以输出的value包含两个向量 。