@@ -51,56 +51,41 @@ def rnn_lm(vocab_size, emb_dim, rnn_type, hidden_size, num_layer):
5151 return cost , output
5252
5353
54- def ngram_lm (vocab_size , emb_dim , hidden_size , num_layer ):
54+ def ngram_lm (vocab_size , emb_dim , hidden_size , num_layer , gram_num = 4 ):
5555 """
5656 N-Gram language model definition.
5757
5858 :param vocab_size: size of vocab.
5959 :param emb_dim: embedding vector's dimension.
6060 :param hidden_size: size of unit.
61- :param num_layer: layer number.
61+ :param num_layer: number of hidden layers.
62+ :param gram_size: gram number in n-gram method
6263 :return: cost and output layer of model.
6364 """
6465
6566 assert emb_dim > 0 and hidden_size > 0 and vocab_size > 0 and num_layer > 0
6667
67- def wordemb (inlayer ):
68- wordemb = paddle .layer .table_projection (
69- input = inlayer ,
70- size = emb_dim ,
71- param_attr = paddle .attr .Param (
72- name = "_proj" , initial_std = 0.001 , learning_rate = 1 , l2_rate = 0 ))
73- return wordemb
74-
7568 # input layers
76- first_word = paddle .layer .data (
77- name = "first_word" , type = paddle .data_type .integer_value (vocab_size ))
78- second_word = paddle .layer .data (
79- name = "second_word" , type = paddle .data_type .integer_value (vocab_size ))
80- third_word = paddle .layer .data (
81- name = "third_word" , type = paddle .data_type .integer_value (vocab_size ))
82- fourth_word = paddle .layer .data (
83- name = "fourth_word" , type = paddle .data_type .integer_value (vocab_size ))
69+ emb_layers = []
70+ for i in range (gram_num ):
71+ word = paddle .layer .data (
72+ name = "__word%02d__" % (i + 1 ),
73+ type = paddle .data_type .integer_value (vocab_size ))
74+ emb = paddle .layer .embedding (
75+ input = word ,
76+ size = emb_dim ,
77+ param_attr = paddle .attr .Param (name = "_proj" , initial_std = 1e-3 ))
78+ emb_layers .append (emb )
8479 next_word = paddle .layer .data (
85- name = "next_word" , type = paddle .data_type .integer_value (vocab_size ))
86-
87- # embedding layer
88- first_emb = wordemb (first_word )
89- second_emb = wordemb (second_word )
90- third_emb = wordemb (third_word )
91- fourth_emb = wordemb (fourth_word )
92-
93- context_emb = paddle .layer .concat (
94- input = [first_emb , second_emb , third_emb , fourth_emb ])
80+ name = "__next_word__" , type = paddle .data_type .integer_value (vocab_size ))
9581
9682 # hidden layer
97- hidden = paddle .layer .fc (
98- input = context_emb , size = hidden_size , act = paddle .activation .Relu ())
99- for _ in range (num_layer - 1 ):
83+ for i in range (num_layer ):
10084 hidden = paddle .layer .fc (
101- input = hidden , size = hidden_size , act = paddle .activation .Relu ())
85+ input = hidden if i else paddle .layer .concat (input = emb_layers ),
86+ size = hidden_size ,
87+ act = paddle .activation .Relu ())
10288
103- # fc(full connected) and output layer
10489 predict_word = paddle .layer .fc (
10590 input = [hidden ], size = vocab_size , act = paddle .activation .Softmax ())
10691
0 commit comments