提交 c3bbf675 编写于 作者: G gangliao 提交者: GitHub

Merge pull request #181 from hedaoyuan/fix

Fix README.md
...@@ -108,14 +108,14 @@ aclImdb ...@@ -108,14 +108,14 @@ aclImdb
``` ```
Paddle在`dataset/imdb.py`中提实现了imdb数据集的自动下载和读取,并提供了读取字典、训练数据、测试数据等API。 Paddle在`dataset/imdb.py`中提实现了imdb数据集的自动下载和读取,并提供了读取字典、训练数据、测试数据等API。
``` ```python
import sys import sys
import paddle.v2 as paddle import paddle.v2 as paddle
``` ```
## 配置模型 ## 配置模型
在该示例中,我们实现了两种文本分类算法,分别基于上文所述的[文本卷积神经网络](#文本卷积神经网络(CNN))[栈式双向LSTM](#栈式双向LSTM(Stacked Bidirectional LSTM))。 在该示例中,我们实现了两种文本分类算法,分别基于上文所述的[文本卷积神经网络](#文本卷积神经网络(CNN))[栈式双向LSTM](#栈式双向LSTM(Stacked Bidirectional LSTM))。
### 文本卷积神经网络 ### 文本卷积神经网络
``` ```python
def convolution_net(input_dim, def convolution_net(input_dim,
class_dim=2, class_dim=2,
emb_dim=128, emb_dim=128,
...@@ -136,7 +136,7 @@ def convolution_net(input_dim, ...@@ -136,7 +136,7 @@ def convolution_net(input_dim,
``` ```
网络的输入`input_dim`表示的是词典的大小,`class_dim`表示类别数。这里,我们使用[`sequence_conv_pool`](https://github.com/PaddlePaddle/Paddle/blob/develop/python/paddle/trainer_config_helpers/networks.py) API实现了卷积和池化操作。 网络的输入`input_dim`表示的是词典的大小,`class_dim`表示类别数。这里,我们使用[`sequence_conv_pool`](https://github.com/PaddlePaddle/Paddle/blob/develop/python/paddle/trainer_config_helpers/networks.py) API实现了卷积和池化操作。
### 栈式双向LSTM ### 栈式双向LSTM
``` ```python
def stacked_lstm_net(input_dim, def stacked_lstm_net(input_dim,
class_dim=2, class_dim=2,
emb_dim=128, emb_dim=128,
...@@ -205,7 +205,7 @@ def stacked_lstm_net(input_dim, ...@@ -205,7 +205,7 @@ def stacked_lstm_net(input_dim,
``` ```
网络的输入`stacked_num`表示的是LSTM的层数,需要是奇数,确保最高层LSTM正向。Paddle里面是通过一个fc和一个lstmemory来实现基于LSTM的循环神经网络。 网络的输入`stacked_num`表示的是LSTM的层数,需要是奇数,确保最高层LSTM正向。Paddle里面是通过一个fc和一个lstmemory来实现基于LSTM的循环神经网络。
## 训练模型 ## 训练模型
``` ```python
if __name__ == '__main__': if __name__ == '__main__':
# init # init
paddle.init(use_gpu=False) paddle.init(use_gpu=False)
...@@ -213,14 +213,14 @@ if __name__ == '__main__': ...@@ -213,14 +213,14 @@ if __name__ == '__main__':
启动paddle程序,use_gpu=False表示用CPU训练,如果系统支持GPU也可以修改成True使用GPU训练。 启动paddle程序,use_gpu=False表示用CPU训练,如果系统支持GPU也可以修改成True使用GPU训练。
### 训练数据 ### 训练数据
使用Paddle提供的数据集`dataset.imdb`中的API来读取训练数据。 使用Paddle提供的数据集`dataset.imdb`中的API来读取训练数据。
``` ```python
print 'load dictionary...' print 'load dictionary...'
word_dict = paddle.dataset.imdb.word_dict() word_dict = paddle.dataset.imdb.word_dict()
dict_dim = len(word_dict) dict_dim = len(word_dict)
class_dim = 2 class_dim = 2
``` ```
加载数据字典,这里通过`word_dict()`API可以直接构造字典。`class_dim`是指样本类别数,该示例中样本只有正负两类。 加载数据字典,这里通过`word_dict()`API可以直接构造字典。`class_dim`是指样本类别数,该示例中样本只有正负两类。
``` ```python
train_reader = paddle.batch( train_reader = paddle.batch(
paddle.reader.shuffle( paddle.reader.shuffle(
lambda: paddle.dataset.imdb.train(word_dict), buf_size=1000), lambda: paddle.dataset.imdb.train(word_dict), buf_size=1000),
...@@ -230,12 +230,12 @@ if __name__ == '__main__': ...@@ -230,12 +230,12 @@ if __name__ == '__main__':
batch_size=100) batch_size=100)
``` ```
这里,`dataset.imdb.train()``dataset.imdb.test()`分别是`dataset.imdb`中的训练数据和测试数据API。`train_reader`在训练时使用,意义是将读取的训练数据进行shuffle后,组成一个batch数据。同理,`test_reader`是在测试的时候使用,将读取的测试数据组成一个batch。 这里,`dataset.imdb.train()``dataset.imdb.test()`分别是`dataset.imdb`中的训练数据和测试数据API。`train_reader`在训练时使用,意义是将读取的训练数据进行shuffle后,组成一个batch数据。同理,`test_reader`是在测试的时候使用,将读取的测试数据组成一个batch。
``` ```python
feeding={'word': 0, 'label': 1} feeding={'word': 0, 'label': 1}
``` ```
`feeding`用来指定`train_reader``test_reader`返回的数据与模型配置中data_layer的对应关系。这里表示reader返回的第0列数据对应`word`层,第1列数据对应`label`层。 `feeding`用来指定`train_reader``test_reader`返回的数据与模型配置中data_layer的对应关系。这里表示reader返回的第0列数据对应`word`层,第1列数据对应`label`层。
### 构造模型 ### 构造模型
``` ```python
# Please choose the way to build the network # Please choose the way to build the network
# by uncommenting the corresponding line. # by uncommenting the corresponding line.
cost = convolution_net(dict_dim, class_dim=class_dim) cost = convolution_net(dict_dim, class_dim=class_dim)
...@@ -243,13 +243,13 @@ if __name__ == '__main__': ...@@ -243,13 +243,13 @@ if __name__ == '__main__':
``` ```
该示例中默认使用`convolution_net`网络,如果使用`stacked_lstm_net`网络,注释相应的行即可。其中cost是网络的优化目标,同时cost包含了整个网络的拓扑信息。 该示例中默认使用`convolution_net`网络,如果使用`stacked_lstm_net`网络,注释相应的行即可。其中cost是网络的优化目标,同时cost包含了整个网络的拓扑信息。
### 网络参数 ### 网络参数
``` ```python
# create parameters # create parameters
parameters = paddle.parameters.create(cost) parameters = paddle.parameters.create(cost)
``` ```
根据网络的拓扑构造网络参数。这里parameters是整个网络的参数集。 根据网络的拓扑构造网络参数。这里parameters是整个网络的参数集。
### 优化算法 ### 优化算法
``` ```python
# create optimizer # create optimizer
adam_optimizer = paddle.optimizer.Adam( adam_optimizer = paddle.optimizer.Adam(
learning_rate=2e-3, learning_rate=2e-3,
...@@ -259,7 +259,7 @@ if __name__ == '__main__': ...@@ -259,7 +259,7 @@ if __name__ == '__main__':
Paddle中提供了一系列优化算法的API,这里使用Adam优化算法。 Paddle中提供了一系列优化算法的API,这里使用Adam优化算法。
### 训练 ### 训练
可以通过`paddle.trainer.SGD`构造一个sgd trainer,并调用`trainer.train`来训练模型。 可以通过`paddle.trainer.SGD`构造一个sgd trainer,并调用`trainer.train`来训练模型。
``` ```python
# End batch and end pass event handler # End batch and end pass event handler
def event_handler(event): def event_handler(event):
if isinstance(event, paddle.event.EndIteration): if isinstance(event, paddle.event.EndIteration):
...@@ -274,7 +274,7 @@ Paddle中提供了一系列优化算法的API,这里使用Adam优化算法。 ...@@ -274,7 +274,7 @@ Paddle中提供了一系列优化算法的API,这里使用Adam优化算法。
print "\nTest with Pass %d, %s" % (event.pass_id, result.metrics) print "\nTest with Pass %d, %s" % (event.pass_id, result.metrics)
``` ```
可以通过给train函数传递一个`event_handler`来获取每个batch和每个pass结束的状态。比如构造如下一个`event_handler`可以在每100个batch结束后输出cost和error;在每个pass结束后调用`trainer.test`计算一遍测试集并获得当前模型在测试集上的error。 可以通过给train函数传递一个`event_handler`来获取每个batch和每个pass结束的状态。比如构造如下一个`event_handler`可以在每100个batch结束后输出cost和error;在每个pass结束后调用`trainer.test`计算一遍测试集并获得当前模型在测试集上的error。
``` ```python
# create trainer # create trainer
trainer = paddle.trainer.SGD(cost=cost, trainer = paddle.trainer.SGD(cost=cost,
parameters=parameters, parameters=parameters,
...@@ -287,7 +287,7 @@ Paddle中提供了一系列优化算法的API,这里使用Adam优化算法。 ...@@ -287,7 +287,7 @@ Paddle中提供了一系列优化算法的API,这里使用Adam优化算法。
num_passes=2) num_passes=2)
``` ```
程序运行之后的输出如下。 程序运行之后的输出如下。
``` ```text
Pass 0, Batch 0, Cost 0.693721, {'classification_error_evaluator': 0.5546875} Pass 0, Batch 0, Cost 0.693721, {'classification_error_evaluator': 0.5546875}
................................................................................................... ...................................................................................................
Pass 0, Batch 100, Cost 0.294321, {'classification_error_evaluator': 0.1015625} Pass 0, Batch 100, Cost 0.294321, {'classification_error_evaluator': 0.1015625}
......
...@@ -150,14 +150,14 @@ aclImdb ...@@ -150,14 +150,14 @@ aclImdb
``` ```
Paddle在`dataset/imdb.py`中提实现了imdb数据集的自动下载和读取,并提供了读取字典、训练数据、测试数据等API。 Paddle在`dataset/imdb.py`中提实现了imdb数据集的自动下载和读取,并提供了读取字典、训练数据、测试数据等API。
``` ```python
import sys import sys
import paddle.v2 as paddle import paddle.v2 as paddle
``` ```
## 配置模型 ## 配置模型
在该示例中,我们实现了两种文本分类算法,分别基于上文所述的[文本卷积神经网络](#文本卷积神经网络(CNN))和[栈式双向LSTM](#栈式双向LSTM(Stacked Bidirectional LSTM))。 在该示例中,我们实现了两种文本分类算法,分别基于上文所述的[文本卷积神经网络](#文本卷积神经网络(CNN))和[栈式双向LSTM](#栈式双向LSTM(Stacked Bidirectional LSTM))。
### 文本卷积神经网络 ### 文本卷积神经网络
``` ```python
def convolution_net(input_dim, def convolution_net(input_dim,
class_dim=2, class_dim=2,
emb_dim=128, emb_dim=128,
...@@ -178,7 +178,7 @@ def convolution_net(input_dim, ...@@ -178,7 +178,7 @@ def convolution_net(input_dim,
``` ```
网络的输入`input_dim`表示的是词典的大小,`class_dim`表示类别数。这里,我们使用[`sequence_conv_pool`](https://github.com/PaddlePaddle/Paddle/blob/develop/python/paddle/trainer_config_helpers/networks.py) API实现了卷积和池化操作。 网络的输入`input_dim`表示的是词典的大小,`class_dim`表示类别数。这里,我们使用[`sequence_conv_pool`](https://github.com/PaddlePaddle/Paddle/blob/develop/python/paddle/trainer_config_helpers/networks.py) API实现了卷积和池化操作。
### 栈式双向LSTM ### 栈式双向LSTM
``` ```python
def stacked_lstm_net(input_dim, def stacked_lstm_net(input_dim,
class_dim=2, class_dim=2,
emb_dim=128, emb_dim=128,
...@@ -247,7 +247,7 @@ def stacked_lstm_net(input_dim, ...@@ -247,7 +247,7 @@ def stacked_lstm_net(input_dim,
``` ```
网络的输入`stacked_num`表示的是LSTM的层数,需要是奇数,确保最高层LSTM正向。Paddle里面是通过一个fc和一个lstmemory来实现基于LSTM的循环神经网络。 网络的输入`stacked_num`表示的是LSTM的层数,需要是奇数,确保最高层LSTM正向。Paddle里面是通过一个fc和一个lstmemory来实现基于LSTM的循环神经网络。
## 训练模型 ## 训练模型
``` ```python
if __name__ == '__main__': if __name__ == '__main__':
# init # init
paddle.init(use_gpu=False) paddle.init(use_gpu=False)
...@@ -255,14 +255,14 @@ if __name__ == '__main__': ...@@ -255,14 +255,14 @@ if __name__ == '__main__':
启动paddle程序,use_gpu=False表示用CPU训练,如果系统支持GPU也可以修改成True使用GPU训练。 启动paddle程序,use_gpu=False表示用CPU训练,如果系统支持GPU也可以修改成True使用GPU训练。
### 训练数据 ### 训练数据
使用Paddle提供的数据集`dataset.imdb`中的API来读取训练数据。 使用Paddle提供的数据集`dataset.imdb`中的API来读取训练数据。
``` ```python
print 'load dictionary...' print 'load dictionary...'
word_dict = paddle.dataset.imdb.word_dict() word_dict = paddle.dataset.imdb.word_dict()
dict_dim = len(word_dict) dict_dim = len(word_dict)
class_dim = 2 class_dim = 2
``` ```
加载数据字典,这里通过`word_dict()`API可以直接构造字典。`class_dim`是指样本类别数,该示例中样本只有正负两类。 加载数据字典,这里通过`word_dict()`API可以直接构造字典。`class_dim`是指样本类别数,该示例中样本只有正负两类。
``` ```python
train_reader = paddle.batch( train_reader = paddle.batch(
paddle.reader.shuffle( paddle.reader.shuffle(
lambda: paddle.dataset.imdb.train(word_dict), buf_size=1000), lambda: paddle.dataset.imdb.train(word_dict), buf_size=1000),
...@@ -272,12 +272,12 @@ if __name__ == '__main__': ...@@ -272,12 +272,12 @@ if __name__ == '__main__':
batch_size=100) batch_size=100)
``` ```
这里,`dataset.imdb.train()`和`dataset.imdb.test()`分别是`dataset.imdb`中的训练数据和测试数据API。`train_reader`在训练时使用,意义是将读取的训练数据进行shuffle后,组成一个batch数据。同理,`test_reader`是在测试的时候使用,将读取的测试数据组成一个batch。 这里,`dataset.imdb.train()`和`dataset.imdb.test()`分别是`dataset.imdb`中的训练数据和测试数据API。`train_reader`在训练时使用,意义是将读取的训练数据进行shuffle后,组成一个batch数据。同理,`test_reader`是在测试的时候使用,将读取的测试数据组成一个batch。
``` ```python
feeding={'word': 0, 'label': 1} feeding={'word': 0, 'label': 1}
``` ```
`feeding`用来指定`train_reader`和`test_reader`返回的数据与模型配置中data_layer的对应关系。这里表示reader返回的第0列数据对应`word`层,第1列数据对应`label`层。 `feeding`用来指定`train_reader`和`test_reader`返回的数据与模型配置中data_layer的对应关系。这里表示reader返回的第0列数据对应`word`层,第1列数据对应`label`层。
### 构造模型 ### 构造模型
``` ```python
# Please choose the way to build the network # Please choose the way to build the network
# by uncommenting the corresponding line. # by uncommenting the corresponding line.
cost = convolution_net(dict_dim, class_dim=class_dim) cost = convolution_net(dict_dim, class_dim=class_dim)
...@@ -285,13 +285,13 @@ if __name__ == '__main__': ...@@ -285,13 +285,13 @@ if __name__ == '__main__':
``` ```
该示例中默认使用`convolution_net`网络,如果使用`stacked_lstm_net`网络,注释相应的行即可。其中cost是网络的优化目标,同时cost包含了整个网络的拓扑信息。 该示例中默认使用`convolution_net`网络,如果使用`stacked_lstm_net`网络,注释相应的行即可。其中cost是网络的优化目标,同时cost包含了整个网络的拓扑信息。
### 网络参数 ### 网络参数
``` ```python
# create parameters # create parameters
parameters = paddle.parameters.create(cost) parameters = paddle.parameters.create(cost)
``` ```
根据网络的拓扑构造网络参数。这里parameters是整个网络的参数集。 根据网络的拓扑构造网络参数。这里parameters是整个网络的参数集。
### 优化算法 ### 优化算法
``` ```python
# create optimizer # create optimizer
adam_optimizer = paddle.optimizer.Adam( adam_optimizer = paddle.optimizer.Adam(
learning_rate=2e-3, learning_rate=2e-3,
...@@ -301,7 +301,7 @@ if __name__ == '__main__': ...@@ -301,7 +301,7 @@ if __name__ == '__main__':
Paddle中提供了一系列优化算法的API,这里使用Adam优化算法。 Paddle中提供了一系列优化算法的API,这里使用Adam优化算法。
### 训练 ### 训练
可以通过`paddle.trainer.SGD`构造一个sgd trainer,并调用`trainer.train`来训练模型。 可以通过`paddle.trainer.SGD`构造一个sgd trainer,并调用`trainer.train`来训练模型。
``` ```python
# End batch and end pass event handler # End batch and end pass event handler
def event_handler(event): def event_handler(event):
if isinstance(event, paddle.event.EndIteration): if isinstance(event, paddle.event.EndIteration):
...@@ -316,7 +316,7 @@ Paddle中提供了一系列优化算法的API,这里使用Adam优化算法。 ...@@ -316,7 +316,7 @@ Paddle中提供了一系列优化算法的API,这里使用Adam优化算法。
print "\nTest with Pass %d, %s" % (event.pass_id, result.metrics) print "\nTest with Pass %d, %s" % (event.pass_id, result.metrics)
``` ```
可以通过给train函数传递一个`event_handler`来获取每个batch和每个pass结束的状态。比如构造如下一个`event_handler`可以在每100个batch结束后输出cost和error;在每个pass结束后调用`trainer.test`计算一遍测试集并获得当前模型在测试集上的error。 可以通过给train函数传递一个`event_handler`来获取每个batch和每个pass结束的状态。比如构造如下一个`event_handler`可以在每100个batch结束后输出cost和error;在每个pass结束后调用`trainer.test`计算一遍测试集并获得当前模型在测试集上的error。
``` ```python
# create trainer # create trainer
trainer = paddle.trainer.SGD(cost=cost, trainer = paddle.trainer.SGD(cost=cost,
parameters=parameters, parameters=parameters,
...@@ -329,7 +329,7 @@ Paddle中提供了一系列优化算法的API,这里使用Adam优化算法。 ...@@ -329,7 +329,7 @@ Paddle中提供了一系列优化算法的API,这里使用Adam优化算法。
num_passes=2) num_passes=2)
``` ```
程序运行之后的输出如下。 程序运行之后的输出如下。
``` ```text
Pass 0, Batch 0, Cost 0.693721, {'classification_error_evaluator': 0.5546875} Pass 0, Batch 0, Cost 0.693721, {'classification_error_evaluator': 0.5546875}
................................................................................................... ...................................................................................................
Pass 0, Batch 100, Cost 0.294321, {'classification_error_evaluator': 0.1015625} Pass 0, Batch 100, Cost 0.294321, {'classification_error_evaluator': 0.1015625}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册