77
88
99class DnnCrf (DnnCrfBase ):
10- def __init__ (self ,* ,config :DnnCrfConfig = None ,data_path :str = '' ,dtype :type = tf .float32 ,mode :str = 'train' ,
10+ def __init__ (self ,* ,config :DnnCrfConfig = None ,task = 'cws' ,data_path :str = '' ,dtype :type = tf .float32 ,
11+ mode :str = 'train' ,
1112predict :str = 'll' ,nn :str ,model_path :str = '' ):
1213if mode not in ['train' ,'predict' ]:
1314raise Exception ('mode error' )
@@ -17,6 +18,8 @@ def __init__(self, *, config: DnnCrfConfig = None, data_path: str = '', dtype: t
1718DnnCrfBase .__init__ (self ,config ,data_path ,mode ,model_path )
1819self .dtype = dtype
1920self .mode = mode
21+ self .task = task
22+ self .nn = nn
2023
2124# 构建
2225tf .reset_default_graph ()
@@ -34,9 +37,11 @@ def __init__(self, *, config: DnnCrfConfig = None, data_path: str = '', dtype: t
3437
3538# 查找表层
3639self .embedding_layer = self .get_embedding_layer ()
40+ # 执行drpout
41+ self .embedding_layer = self .get_dropout_layer (self .embedding_layer )
3742# 隐藏层
3843if nn == 'mlp' :
39- self .hidden_layer = self .get_mlp_layer (tf . transpose ( self .embedding_layer ) )
44+ self .hidden_layer = self .get_mlp_layer (self .embedding_layer )
4045elif nn == 'lstm' :
4146self .hidden_layer = self .get_lstm_layer (self .embedding_layer )
4247elif nn == 'bilstm' :
@@ -62,22 +67,20 @@ def __init__(self, *, config: DnnCrfConfig = None, data_path: str = '', dtype: t
6267self .new_optimizer = tf .train .AdamOptimizer ()
6368self .train = self .optimizer .minimize (- self .loss )
6469
65- def fit (self ,epochs :int = 100 ,interval :int = 20 ):
70+ def fit (self ,epochs :int = 50 ,interval :int = 10 ):
6671with tf .Session ()as sess :
6772tf .global_variables_initializer ().run ()
6873saver = tf .train .Saver (max_to_keep = epochs )
6974for epoch in range (1 ,epochs + 1 ):
7075print ('epoch:' ,epoch )
7176for _ in range (self .batch_count ):
7277characters ,labels ,lengths = self .get_batch ()
73- # scores = sess.run(self.output, feed_dict={self.input: characters})
7478feed_dict = {self .input :characters ,self .real_indices :labels ,self .seq_length :lengths }
7579sess .run (self .train ,feed_dict = feed_dict )
76- # self.fit_batch(characters, labels, lengths, sess)
77- # if epoch % interval == 0:
78- model_path = '../dnlp/models/cws{0}.ckpt' .format (epoch )
79- saver .save (sess ,model_path )
80- self .save_config (model_path )
80+ if epoch % interval == 0 :
81+ model_path = '../dnlp/models/{0}-{1}-{2}.ckpt' .format (self .task ,self .nn ,epoch )
82+ saver .save (sess ,model_path )
83+ self .save_config (model_path )
8184
8285def predict (self ,sentence :str ,return_labels = False ):
8386if self .mode != 'predict' :
@@ -87,10 +90,14 @@ def predict(self, sentence: str, return_labels=False):
8790runner = [self .output ,self .transition ,self .transition_init ]
8891output ,trans ,trans_init = self .sess .run (runner ,feed_dict = {self .input :input })
8992labels = self .viterbi (output ,trans ,trans_init )
93+ if self .task == 'cws' :
94+ result = self .tags2words (sentence ,labels )
95+ else :
96+ result = self .tags2entities (sentence ,labels )
9097if not return_labels :
91- return self . tags2words ( sentence , labels )
98+ return result
9299else :
93- return self . tags2words ( sentence , labels ) ,self .tag2sequences (labels )
100+ return result ,self .tag2sequences (labels )
94101
95102def predict_ll (self ,sentence :str ,return_labels = False ):
96103if self .mode != 'predict' :
@@ -103,10 +110,14 @@ def predict_ll(self, sentence: str, return_labels=False):
103110# print(output)
104111# print(trans)
105112labels = np .squeeze (labels )
113+ if self .task == 'cws' :
114+ result = self .tags2words (sentence ,labels )
115+ else :
116+ result = self .tags2entities (sentence ,labels )
106117if return_labels :
107- return self . tags2words ( sentence , labels ) ,self .tag2sequences (labels )
118+ return result ,self .tag2sequences (labels )
108119else :
109- return self . tags2words ( sentence , labels )
120+ return result
110121
111122def get_embedding_layer (self )-> tf .Tensor :
112123embeddings = self .__get_variable ([self .dict_size ,self .embed_size ],'embeddings' )
@@ -122,28 +133,28 @@ def get_mlp_layer(self, layer: tf.Tensor) -> tf.Tensor:
122133hidden_weight = self .__get_variable ([self .hidden_units ,self .concat_embed_size ],'hidden_weight' )
123134hidden_bias = self .__get_variable ([self .hidden_units ,1 ,1 ],'hidden_bias' )
124135self .params += [hidden_weight ,hidden_bias ]
125- layer = tf .sigmoid (tf .tensordot (hidden_weight ,layer , [[1 ], [0 ]])+ hidden_bias )
126- return layer
136+ layer = tf .sigmoid (tf .tensordot (hidden_weight ,tf . transpose ( layer ) , [[1 ], [0 ]])+ hidden_bias )
137+ return tf . transpose ( layer )
127138
128139def get_rnn_layer (self ,layer :tf .Tensor )-> tf .Tensor :
129- rnn = tf .nn .rnn_cell .RNNCell (self .hidden_units )
140+ rnn = tf .nn .rnn_cell .BasicRNNCell (self .hidden_units )
130141rnn_output ,rnn_out_state = tf .nn .dynamic_rnn (rnn ,layer ,dtype = self .dtype )
131142self .params += [v for v in tf .global_variables ()if v .name .startswith ('rnn' )]
132143return rnn_output
133144
134145def get_lstm_layer (self ,layer :tf .Tensor )-> tf .Tensor :
135- lstm = tf .nn .rnn_cell .LSTMCell (self .hidden_units )
146+ lstm = tf .nn .rnn_cell .BasicLSTMCell (self .hidden_units )
136147lstm_output ,lstm_out_state = tf .nn .dynamic_rnn (lstm ,layer ,dtype = self .dtype )
137148self .params += [v for v in tf .global_variables ()if v .name .startswith ('rnn' )]
138149return lstm_output
139150
140151def get_bilstm_layer (self ,layer :tf .Tensor )-> tf .Tensor :
141- lstm_fw = tf .nn .rnn_cell .LSTMCell (self .hidden_units // 2 )
142- lstm_bw = tf .nn .rnn_cell .LSTMCell (self .hidden_units // 2 )
152+ lstm_fw = tf .nn .rnn_cell .BasicLSTMCell (self .hidden_units // 2 )
153+ lstm_bw = tf .nn .rnn_cell .BasicLSTMCell (self .hidden_units // 2 )
143154bilstm_output ,bilstm_output_state = tf .nn .bidirectional_dynamic_rnn (lstm_fw ,lstm_bw ,layer ,self .seq_length ,
144155dtype = self .dtype )
145156self .params += [v for v in tf .global_variables ()if v .name .startswith ('rnn' )]
146- return tf .concat ([bilstm_output [0 ],bilstm_output [1 ]],- 1 )
157+ return tf .concat ([bilstm_output [0 ],bilstm_output [1 ]],- 1 )
147158
148159def get_gru_layer (self ,layer :tf .Tensor )-> tf .Tensor :
149160gru = tf .nn .rnn_cell .GRUCell (self .hidden_units )