|
| 1 | +############ |
| 2 | +基本使用概念 |
| 3 | +############ |
| 4 | + |
| 5 | +PaddlePaddle是源于百度的一个深度学习平台。PaddlePaddle为深度学习研究人员提供了丰富的API,可以轻松地完成神经网络配置,模型训练等任务。 |
| 6 | +这里将介绍PaddlePaddle的基本使用概念,并且展示了如何利用PaddlePaddle来解决一个经典的线性回归问题。 |
| 7 | +在使用该文档之前,请参考 `安装文档 <../build_and_install/index_cn.html>`_ 完成PaddlePaddle的安装。 |
| 8 | + |
| 9 | + |
| 10 | +配置网络 |
| 11 | +============ |
| 12 | + |
| 13 | +加载PaddlePaddle |
| 14 | +---------------------- |
| 15 | + |
| 16 | +在进行网络配置之前,首先需要加载相应的Python库,并进行初始化操作。 |
| 17 | + |
| 18 | +.. code-block:: bash |
| 19 | +
|
| 20 | + import paddle.v2 as paddle |
| 21 | + import numpy as np |
| 22 | + paddle.init(use_gpu=False) |
| 23 | +
|
| 24 | +
|
| 25 | +搭建神经网络 |
| 26 | +----------------------- |
| 27 | + |
| 28 | +搭建神经网络就像使用积木搭建宝塔一样。在PaddlePaddle中,layer是我们的积木,而神经网络是我们要搭建的宝塔。我们使用不同的layer进行组合,来搭建神经网络。 |
| 29 | +宝塔的底端需要坚实的基座来支撑,同样,神经网络也需要一些特定的layer作为输入接口,来完成网络的训练。 |
| 30 | + |
| 31 | +例如,我们可以定义如下layer来描述神经网络的输入: |
| 32 | + |
| 33 | +.. code-block:: bash |
| 34 | +
|
| 35 | + x = paddle.layer.data(name='x', type=paddle.data_type.dense_vector(2)) |
| 36 | + y = paddle.layer.data(name='y', type=paddle.data_type.dense_vector(1)) |
| 37 | +
|
| 38 | +其中x表示输入数据是一个维度为2的稠密向量,y表示输入数据是一个维度为1的稠密向量。 |
| 39 | + |
| 40 | +PaddlePaddle支持不同类型的输入数据,主要包括四种类型,和三种序列模式。 |
| 41 | + |
| 42 | +四种数据类型: |
| 43 | + |
| 44 | +* dense_vector:稠密的浮点数向量。 |
| 45 | +* sparse_binary_vector:稀疏的01向量,即大部分值为0,但有值的地方必须为1。 |
| 46 | +* sparse_float_vector:稀疏的向量,即大部分值为0,但有值的部分可以是任何浮点数。 |
| 47 | +* integer:整数标签。 |
| 48 | + |
| 49 | +三种序列模式: |
| 50 | + |
| 51 | +* SequenceType.NO_SEQUENCE:不是一条序列 |
| 52 | +* SequenceType.SEQUENCE:是一条时间序列 |
| 53 | +* SequenceType.SUB_SEQUENCE: 是一条时间序列,且序列的每一个元素还是一个时间序列。 |
| 54 | + |
| 55 | +不同的数据类型和序列模式返回的格式不同,列表如下: |
| 56 | + |
| 57 | ++----------------------+---------------------+-----------------------------------+------------------------------------------------+ |
| 58 | +| | NO_SEQUENCE | SEQUENCE | SUB_SEQUENCE | |
| 59 | ++======================+=====================+===================================+================================================+ |
| 60 | +| dense_vector | [f, f, ...] | [[f, ...], [f, ...], ...] | [[[f, ...], ...], [[f, ...], ...],...] | |
| 61 | ++----------------------+---------------------+-----------------------------------+------------------------------------------------+ |
| 62 | +| sparse_binary_vector | [i, i, ...] | [[i, ...], [i, ...], ...] | [[[i, ...], ...], [[i, ...], ...],...] | |
| 63 | ++----------------------+---------------------+-----------------------------------+------------------------------------------------+ |
| 64 | +| sparse_float_vector | [(i,f), (i,f), ...] | [[(i,f), ...], [(i,f), ...], ...] | [[[(i,f), ...], ...], [[(i,f), ...], ...],...] | |
| 65 | ++----------------------+---------------------+-----------------------------------+------------------------------------------------+ |
| 66 | +| integer_value | i | [i, i, ...] | [[i, ...], [i, ...], ...] | |
| 67 | ++----------------------+---------------------+-----------------------------------+------------------------------------------------+ |
| 68 | + |
| 69 | +其中,f代表一个浮点数,i代表一个整数。 |
| 70 | + |
| 71 | +注意:对sparse_binary_vector和sparse_float_vector,PaddlePaddle存的是有值位置的索引。例如, |
| 72 | + |
| 73 | +- 对一个5维非序列的稀疏01向量 ``[0, 1, 1, 0, 0]`` ,类型是sparse_binary_vector,返回的是 ``[1, 2]`` 。 |
| 74 | +- 对一个5维非序列的稀疏浮点向量 ``[0, 0.5, 0.7, 0, 0]`` ,类型是sparse_float_vector,返回的是 ``[(1, 0.5), (2, 0.7)]`` 。 |
| 75 | + |
| 76 | + |
| 77 | +在定义输入layer之后,我们可以使用其他layer进行组合。在组合时,需要指定layer的输入来源。 |
| 78 | + |
| 79 | +例如,我们可以定义如下的layer组合: |
| 80 | + |
| 81 | +.. code-block:: bash |
| 82 | +
|
| 83 | + y_predict = paddle.layer.fc(input=x, size=1, act=paddle.activation.Linear()) |
| 84 | + cost = paddle.layer.mse_cost(input=y_predict, label=y) |
| 85 | +
|
| 86 | +其中,x与y为之前描述的输入层;而y_predict是接收x作为输入,接上一个全连接层;cost接收y_predict与y作为输入,接上均方误差层。 |
| 87 | + |
| 88 | +最后一层cost中记录了神经网络的所有拓扑结构,通过组合不同的layer,我们即可完成神经网络的搭建。 |
| 89 | + |
| 90 | + |
| 91 | +训练模型 |
| 92 | +============ |
| 93 | + |
| 94 | +在完成神经网络的搭建之后,我们首先需要根据神经网络结构来创建所需要优化的parameters,并创建optimizer。 |
| 95 | +之后,我们可以创建trainer来对网络进行训练。 |
| 96 | + |
| 97 | +.. code-block:: bash |
| 98 | +
|
| 99 | + parameters = paddle.parameters.create(cost) |
| 100 | + optimizer = paddle.optimizer.Momentum(momentum=0) |
| 101 | + trainer = paddle.trainer.SGD(cost=cost, |
| 102 | + parameters=parameters, |
| 103 | + update_equation=optimizer) |
| 104 | +
|
| 105 | +其中,trainer接收三个参数,包括神经网络拓扑结构、神经网络参数以及迭代方程。 |
| 106 | + |
| 107 | +在搭建神经网络的过程中,我们仅仅对神经网络的输入进行了描述。而trainer需要读取训练数据进行训练,PaddlePaddle中通过reader来加载数据。 |
| 108 | + |
| 109 | +.. code-block:: bash |
| 110 | +
|
| 111 | + # define training dataset reader |
| 112 | + def train_reader(): |
| 113 | + train_x = np.array([[1, 1], [1, 2], [3, 4], [5, 2]]) |
| 114 | + train_y = np.array([-2, -3, -7, -7]) |
| 115 | + def reader(): |
| 116 | + for i in xrange(train_y.shape[0]): |
| 117 | + yield train_x[i], train_y[i] |
| 118 | + return reader |
| 119 | +
|
| 120 | +最终我们可以调用trainer的train方法启动训练: |
| 121 | +
|
| 122 | +.. code-block:: bash |
| 123 | +
|
| 124 | + # define feeding map |
| 125 | + feeding = {'x': 0, 'y': 1} |
| 126 | +
|
| 127 | + # event_handler to print training info |
| 128 | + def event_handler(event): |
| 129 | + if isinstance(event, paddle.event.EndIteration): |
| 130 | + if event.batch_id % 1 == 0: |
| 131 | + print "Pass %d, Batch %d, Cost %f" % ( |
| 132 | + event.pass_id, event.batch_id, event.cost) |
| 133 | + # training |
| 134 | + trainer.train( |
| 135 | + reader=paddle.batch(train_reader(), batch_size=1), |
| 136 | + feeding=feeding, |
| 137 | + event_handler=event_handler, |
| 138 | + num_passes=100) |
| 139 | +
|
| 140 | +关于PaddlePaddle的更多使用方法请参考 `进阶指南 <../../howto/index_cn.html>`_。 |
| 141 | +
|
| 142 | +线性回归完整示例 |
| 143 | +============== |
| 144 | +
|
| 145 | +下面给出在三维空间中使用线性回归拟合一条直线的例子: |
| 146 | +
|
| 147 | +.. literalinclude:: src/train.py |
| 148 | + :linenos: |
| 149 | +
|
| 150 | +有关线性回归的实际应用,可以参考PaddlePaddle book的 `第一章节 <http://book.paddlepaddle.org/index.html>`_。 |
0 commit comments