99
1010class DnnCrf (DnnCrfBase ):
1111def __init__ (self ,* ,config :DnnCrfConfig = None ,task = 'cws' ,data_path :str = '' ,dtype :type = tf .float32 ,
12- mode :str = 'train' ,predict :str = 'll' ,nn :str ,model_path :str = '' ,embedding_path :str = '' ):
12+ mode :str = 'train' ,dropout_position :str = 'input' ,predict :str = 'll' ,nn :str ,model_path :str = '' ,
13+ embedding_path :str = '' ,remark :str = '' ):
1314if mode not in ['train' ,'predict' ]:
1415raise Exception ('mode error' )
1516if nn not in ['mlp' ,'rnn' ,'lstm' ,'bilstm' ,'gru' ]:
@@ -20,63 +21,75 @@ def __init__(self, *, config: DnnCrfConfig = None, task='cws', data_path: str =
2021self .mode = mode
2122self .task = task
2223self .nn = nn
24+ self .remark = remark
2325self .embedding_path = embedding_path
24-
25- # 构建
26- tf .reset_default_graph ()
27- self .transition = self .__get_variable ([self .tags_count ,self .tags_count ],'transition' )
28- self .transition_init = self .__get_variable ([self .tags_count ],'transition_init' )
29- self .params = [self .transition ,self .transition_init ]
30- # 输入层
31- if mode == 'train' :
32- self .input = tf .placeholder (tf .int32 , [self .batch_size ,self .batch_length ,self .windows_size ])
33- self .real_indices = tf .placeholder (tf .int32 , [self .batch_size ,self .batch_length ])
34- else :
35- self .input = tf .placeholder (tf .int32 , [None ,self .windows_size ])
36-
37- self .seq_length = tf .placeholder (tf .int32 , [None ])
38-
39- # 查找表层
40- self .embedding_layer = self .get_embedding_layer ()
41- # 执行drpout
42- self .embedding_layer = self .get_dropout_layer (self .embedding_layer )
43- # 隐藏层
44- if nn == 'mlp' :
45- self .hidden_layer = self .get_mlp_layer (self .embedding_layer )
46- elif nn == 'lstm' :
47- self .hidden_layer = self .get_lstm_layer (self .embedding_layer )
48- elif nn == 'bilstm' :
49- self .hidden_layer = self .get_bilstm_layer (self .embedding_layer )
50- elif nn == 'gru' :
51- self .hidden_layer = self .get_gru_layer (self .embedding_layer )
52- else :
53- self .hidden_layer = self .get_rnn_layer (self .embedding_layer )
54- # 输出层
55- self .output = self .get_output_layer (self .hidden_layer )
56-
57- if mode == 'predict' :
58- if predict != 'll' :
59- self .output = tf .squeeze (tf .transpose (self .output ),axis = 2 )
60- self .seq ,self .best_score = tf .contrib .crf .crf_decode (self .output ,self .transition ,self .seq_length )
61- self .sess = tf .Session ()
62- self .sess .run (tf .global_variables_initializer ())
63- tf .train .Saver ().restore (save_path = self .model_path ,sess = self .sess )
64- else :
65- self .loss ,_ = tf .contrib .crf .crf_log_likelihood (self .output ,self .real_indices ,self .seq_length ,
66- self .transition )
67- self .optimizer = tf .train .AdagradOptimizer (self .learning_rate )
68- self .new_optimizer = tf .train .AdamOptimizer ()
69- self .train = self .optimizer .minimize (- self .loss )
70- current_dir = os .path .dirname (__file__ )
71- dest_dir = os .path .realpath (os .path .join (current_dir ,'..\\ data\\ logs' ))
72- self .train_writer = tf .summary .FileWriter (dest_dir ,flush_secs = 10 )
73- tf .summary .scalar ('loss' ,- self .loss )
74- # tf.summary.scalar('accuracy',)
75- self .merged = tf .summary .merge_all ()
76-
26+ self .graph = tf .Graph ()
27+ with self .graph .as_default ():
28+ # 构建
29+ # tf.reset_default_graph()
30+ self .transition = self .__get_variable ([self .tags_count ,self .tags_count ],'transition' )
31+ self .transition_init = self .__get_variable ([self .tags_count ],'transition_init' )
32+ self .params = [self .transition ,self .transition_init ]
33+ # 输入层
34+
35+ if mode == 'train' :
36+ self .input = tf .placeholder (tf .int32 , [self .batch_size ,self .batch_length ,self .windows_size ])
37+ self .real_indices = tf .placeholder (tf .int32 , [self .batch_size ,self .batch_length ])
38+ else :
39+ self .input = tf .placeholder (tf .int32 , [None ,self .windows_size ])
40+
41+ self .seq_length = tf .placeholder (tf .int32 , [None ])
42+
43+ # 查找表层
44+ self .embedding_layer = self .get_embedding_layer ()
45+ # 执行drpout
46+ if dropout_position == 'input' :
47+ self .embedding_layer = self .get_dropout_layer (self .embedding_layer )
48+ # 隐藏层
49+ if nn == 'mlp' :
50+ self .hidden_layer = self .get_mlp_layer (self .embedding_layer )
51+ elif nn == 'lstm' :
52+ self .hidden_layer = self .get_lstm_layer (self .embedding_layer )
53+ elif nn == 'bilstm' :
54+ self .hidden_layer = self .get_bilstm_layer (self .embedding_layer )
55+ elif nn == 'gru' :
56+ self .hidden_layer = self .get_gru_layer (self .embedding_layer )
57+ else :
58+ self .hidden_layer = self .get_rnn_layer (self .embedding_layer )
59+ if dropout_position == 'hidden' :
60+ self .hidden_layer = self .get_dropout_layer (self .hidden_layer )
61+ # 输出层
62+ self .output = self .get_output_layer (self .hidden_layer )
63+
64+ if mode == 'predict' :
65+ if predict != 'll' :
66+ self .output = tf .squeeze (tf .transpose (self .output ),axis = 2 )
67+ self .seq ,self .best_score = tf .contrib .crf .crf_decode (self .output ,self .transition ,self .seq_length )
68+ self .sess = tf .Session ()
69+ self .sess .run (tf .global_variables_initializer ())
70+ tf .train .Saver ().restore (save_path = self .model_path ,sess = self .sess )
71+ else :
72+ self .crf_loss ,_ = tf .contrib .crf .crf_log_likelihood (self .output ,self .real_indices ,self .seq_length ,
73+ self .transition )
74+ #self.loss = -self.loss
75+ self .regularization = tf .contrib .layers .apply_regularization (tf .contrib .layers .l2_regularizer (self .lam ),
76+ self .params )
77+ self .loss = - self .crf_loss / self .batch_size + self .regularization
78+ self .optimizer = tf .train .AdagradOptimizer (self .learning_rate )
79+ self .new_optimizer = tf .train .AdamOptimizer ()
80+ gvs = self .optimizer .compute_gradients (self .loss )
81+ cliped_grad = [(tf .clip_by_norm (grad ,5 )if grad is not None else grad ,var )for grad ,var in gvs ]
82+ self .train = self .optimizer .apply_gradients (cliped_grad )# self.optimizer.minimize(self.loss)
83+ # self.train = self.optimizer.minimize(self.loss)
84+ current_dir = os .path .dirname (__file__ )
85+ dest_dir = os .path .realpath (os .path .join (current_dir ,'..\\ data\\ logs' ))
86+ self .train_writer = tf .summary .FileWriter (dest_dir ,flush_secs = 10 )
87+ self .mean_loss = tf .reduce_mean (self .loss )
88+ tf .summary .scalar ('loss' ,self .mean_loss )
89+ self .merged = tf .summary .merge_all ()
7790
7891def fit (self ,epochs :int = 50 ,interval :int = 10 ):
79- with tf .Session ()as sess :
92+ with tf .Session (graph = self . graph )as sess :
8093tf .global_variables_initializer ().run ()
8194saver = tf .train .Saver (max_to_keep = epochs )
8295for epoch in range (1 ,epochs + 1 ):
@@ -85,13 +98,15 @@ def fit(self, epochs: int = 50, interval: int = 10):
8598for i in range (self .batch_count ):
8699characters ,labels ,lengths = self .get_batch ()
87100feed_dict = {self .input :characters ,self .real_indices :labels ,self .seq_length :lengths }
88- _ ,summary ,loss = sess .run ([self .train ,self .merged ,- self .loss ],feed_dict = feed_dict )
89- # summary,loss = sess.run([],feed_dict=feed_dict)
90- self .train_writer .add_summary (summary ,j )
91- j += 1
101+ _ ,summary ,loss = sess .run ([self .train ,self .merged ,self .mean_loss ],feed_dict = feed_dict )
102+ self .train_writer .add_summary (summary ,j )
103+ j += 1
92104if epoch % interval == 0 :
93105if not self .embedding_path :
94- model_path = '../dnlp/models/{0}-{1}-{2}.ckpt' .format (self .task ,self .nn ,epoch )
106+ if self .remark :
107+ model_path = '../dnlp/models/{0}-{1}-{2}-{3}.ckpt' .format (self .task ,self .nn ,self .remark ,epoch )
108+ else :
109+ model_path = '../dnlp/models/{0}-{1}-{2}.ckpt' .format (self .task ,self .nn ,epoch )
95110else :
96111model_path = '../dnlp/models/{0}-{1}-embedding-{2}.ckpt' .format (self .task ,self .nn ,epoch )
97112saver .save (sess ,model_path )