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' :
@@ -63,22 +68,20 @@ def __init__(self, *, config: DnnCrfConfig = None, data_path: str = '', dtype: t
6368self .new_optimizer = tf .train .AdamOptimizer ()
6469self .train = self .optimizer .minimize (- self .loss )
6570
66- def fit (self ,epochs :int = 100 ,interval :int = 20 ):
71+ def fit (self ,epochs :int = 50 ,interval :int = 10 ):
6772with tf .Session ()as sess :
6873tf .global_variables_initializer ().run ()
6974saver = tf .train .Saver (max_to_keep = epochs )
7075for epoch in range (1 ,epochs + 1 ):
7176print ('epoch:' ,epoch )
7277for _ in range (self .batch_count ):
7378characters ,labels ,lengths = self .get_batch ()
74- # scores = sess.run(self.output, feed_dict={self.input: characters})
7579feed_dict = {self .input :characters ,self .real_indices :labels ,self .seq_length :lengths }
7680sess .run (self .train ,feed_dict = feed_dict )
77- # self.fit_batch(characters, labels, lengths, sess)
78- # if epoch % interval == 0:
79- model_path = '../dnlp/models/cws{0}.ckpt' .format (epoch )
80- saver .save (sess ,model_path )
81- self .save_config (model_path )
81+ if epoch % interval == 0 :
82+ model_path = '../dnlp/models/{0}-{1}-{2}.ckpt' .format (self .task ,self .nn ,epoch )
83+ saver .save (sess ,model_path )
84+ self .save_config (model_path )
8285
8386def predict (self ,sentence :str ,return_labels = False ):
8487if self .mode != 'predict' :
@@ -88,10 +91,14 @@ def predict(self, sentence: str, return_labels=False):
8891runner = [self .output ,self .transition ,self .transition_init ]
8992output ,trans ,trans_init = self .sess .run (runner ,feed_dict = {self .input :input })
9093labels = self .viterbi (output ,trans ,trans_init )
94+ if self .task == 'cws' :
95+ result = self .tags2words (sentence ,labels )
96+ else :
97+ result = self .tags2entities (sentence ,labels )
9198if not return_labels :
92- return self . tags2words ( sentence , labels )
99+ return result
93100else :
94- return self . tags2words ( sentence , labels ) ,self .tag2sequences (labels )
101+ return result ,self .tag2sequences (labels )
95102
96103def predict_ll (self ,sentence :str ,return_labels = False ):
97104if self .mode != 'predict' :
@@ -104,10 +111,14 @@ def predict_ll(self, sentence: str, return_labels=False):
104111# print(output)
105112# print(trans)
106113labels = np .squeeze (labels )
114+ if self .task == 'cws' :
115+ result = self .tags2words (sentence ,labels )
116+ else :
117+ result = self .tags2entities (sentence ,labels )
107118if return_labels :
108- return self . tags2words ( sentence , labels ) ,self .tag2sequences (labels )
119+ return result ,self .tag2sequences (labels )
109120else :
110- return self . tags2words ( sentence , labels )
121+ return result
111122
112123def get_embedding_layer (self )-> tf .Tensor :
113124# embeddings = self.__get_variable([self.dict_size, self.embed_size], 'embeddings')
@@ -125,8 +136,8 @@ def get_mlp_layer(self, layer: tf.Tensor) -> tf.Tensor:
125136hidden_weight = self .__get_variable ([self .hidden_units ,self .concat_embed_size ],'hidden_weight' )
126137hidden_bias = self .__get_variable ([self .hidden_units ,1 ,1 ],'hidden_bias' )
127138self .params += [hidden_weight ,hidden_bias ]
128- layer = tf .sigmoid (tf .tensordot (hidden_weight ,layer , [[1 ], [0 ]])+ hidden_bias )
129- return layer
139+ layer = tf .sigmoid (tf .tensordot (hidden_weight ,tf . transpose ( layer ) , [[1 ], [0 ]])+ hidden_bias )
140+ return tf . transpose ( layer )
130141
131142def get_rnn_layer (self ,layer :tf .Tensor )-> tf .Tensor :
132143rnn = tf .nn .rnn_cell .BasicRNNCell (self .hidden_units )