@@ -57,7 +57,7 @@ def train_data(filename, word_dict, n):
5757图2. 网络配置结构
5858</p >
5959
60- 代码实现如下 :
60+ 代码如下 :
6161
6262``` python
6363def ngram_lm (hidden_size , embed_size , dict_size , gram_num = 4 , is_train = True ):
@@ -86,31 +86,30 @@ def ngram_lm(hidden_size, embed_size, dict_size, gram_num=4, is_train=True):
8686 param_attr = paddle.attr.Param(
8787 initial_std = 1 . / math.sqrt(embed_size * 8 ), learning_rate = 1 ))
8888
89- if is_train == True :
90- cost = paddle.layer.hsigmoid(
91- input = hidden_layer,
92- label = target_word,
93- num_classes = dict_size,
94- param_attr = paddle.attr.Param(name = " sigmoid_w" ),
95- bias_attr = paddle.attr.Param(name = " sigmoid_b" ))
96- return cost
97- else :
98- prediction = paddle.layer.fc(
99- size = dict_size - 1 ,
100- input = hidden_layer,
101- act = paddle.activation.Sigmoid(),
102- bias_attr = paddle.attr.Param(name = " sigmoid_b" ),
103- param_attr = paddle.attr.Param(name = " sigmoid_w" ))
104- return prediction
89+ return paddle.layer.hsigmoid(
90+ input = hidden_layer,
91+ label = target_word,
92+ param_attr = paddle.attr.Param(name = " sigmoid_w" ),
93+ bias_attr = paddle.attr.Param(name = " sigmoid_b" ))
10594```
10695
107- 需要注意,在预测阶段,我们需要对hsigmoid参数做一次转置,这里输出的类别数为词典大小减1,对应非叶节点的数量。
96+ 需要注意在 PaddlePaddle 中,hsigmoid 层将可学习参数存储为一个 ` [类别数目 - 1 × 隐层向量宽度] ` 大小的矩阵。预测时,需要将 hsigmoid 层替换为全连接运算** 并固定以 ` sigmoid ` 为激活** 。预测时输出一个宽度为` [batch_size x 类别数目 - 1] ` 维度的矩阵(` batch_size = 1 ` 时退化为一个向量)。矩阵行向量的每一维计算了一个输入向量属于一个内部结点的右孩子的概率。** 全连接运算在加载 hsigmoid 层学习到的参数矩阵时,需要对参数矩阵进行一次转置** 。代码片段如下:
97+
98+ ``` python
99+ return paddle.layer.mixed(
100+ size = dict_size - 1 ,
101+ input = paddle.layer.trans_full_matrix_projection(
102+ hidden_layer, param_attr = paddle.attr.Param(name = " sigmoid_w" )),
103+ act = paddle.activation.Sigmoid(),
104+ bias_attr = paddle.attr.Param(name = " sigmoid_b" ))
105+ ```
106+ 上述代码片段中的 ` paddle.layer.mixed ` 必须以 PaddlePaddle 中 ` paddle.layer.×_projection ` 为输入。` paddle.layer.mixed ` 将多个 ` projection ` (输入可以是多个)计算结果求和作为输出。` paddle.layer.trans_full_matrix_projection ` 在计算矩阵乘法时会对参数$W$进行转置。
108107
109108## 训练阶段
110109训练比较简单,直接运行``` python train.py ``` 。程序第一次运行会检测用户缓存文件夹中是否包含imikolov数据集,如果未包含,则自动下载。运行过程中,每100个iteration会打印模型训练信息,主要包含训练损失和测试损失,每个pass会保存一次模型。
111110
112111## 预测阶段
113- 预测时,直接运行 ``` python infer.py ``` , 程序会首先load模型,然后按照batch方式进行预测,并打印预测结果。预测阶段最重要的就是根据概率得到编码路径,然后遍历路径获取最终的预测类别,这部分逻辑如下:
112+ 预测时,在命令行运行 ` infer.py --model_path XX ` ,通过 ` model_path ` 指定训练好的模型所在的路径。 程序会首先load模型,然后按照batch方式进行预测,并打印预测结果。预测阶段最重要的就是根据概率得到编码路径,然后遍历路径获取最终的预测类别,这部分逻辑如下:
114113
115114``` python
116115def decode_res (infer_res , dict_size ):
0 commit comments