3333optimizer = None
3434train_op = None
3535global_step = None
36+ _summary_op = None
37+ _summary_writer = None
3638
3739def model_fn (sync , num_replicas ):
3840 # 这些变量在后续的训练操作函数 train_fn() 中会使用到,
3941 # 所以这里使用了 global 变量。
4042 global input_images , loss , labels , optimizer , train_op , accuracy
41- global mnist , global_step
43+ global mnist , global_step , _summary_op , _summary_writer
4244
4345 # 构建推理模型
4446 input_images = tf .placeholder (tf .float32 , [None , 784 ], name = 'image' )
@@ -54,6 +56,7 @@ def model_fn(sync, num_replicas):
5456 labels = tf .placeholder (tf .float32 , [None , 10 ], name = 'labels' )
5557 cross_entropy = tf .reduce_mean (
5658 tf .nn .softmax_cross_entropy_with_logits (logits = logits , labels = labels ))
59+ tf .summary .scalar ("cross_entropy" , cross_entropy )
5760 loss = tf .reduce_mean (cross_entropy , name = 'loss' )
5861 tf .add_to_collection (tf .GraphKeys .LOSSES , loss )
5962
@@ -68,6 +71,12 @@ def model_fn(sync, num_replicas):
6871 name = "mnist_sync_replicas" )
6972
7073 train_op = optimizer .minimize (cross_entropy , global_step = global_step )
74+
75+ # 自定义计算模型 summary 信息的 Operation,
76+ # 并定义一个 FileWriter 用于保存模型 summary 信息。
77+ # 其中 dist_base.cfg.logdir 是 TaaS 平台上设置的训练日志路径参数。
78+ _summary_op = tf .summary .merge_all ()
79+ _summary_writer = tf .summary .FileWriter (dist_base .cfg .logdir )
7180
7281 # Test trained model
7382 correct_prediction = tf .equal (tf .argmax (logits , 1 ),
@@ -89,12 +98,17 @@ def accuracy_evalute_fn(session):
8998 model_metric_ops = {
9099 "accuracy" : accuracy_evalute_fn
91100 }
92-
101+
102+ # 因为模型中需要计算 tf.summary.scalar(cross_entropy),而该 summary 的计算需要
103+ # feed 设置 _input_images 和 _labels,所以这里将 summary_op 设置成 None,将关闭
104+ # TaaS 的自动计算和保存模型 summary 信息机制。在 train_op 函数中自己来计算并收集
105+ # 模型 Graph 的 summary 信息。
93106 return dist_base .ModelFnHandler (
94107 global_step = global_step ,
95108 optimizer = optimizer ,
96109 model_metric_ops = model_metric_ops ,
97- model_export_spec = model_export_spec )
110+ model_export_spec = model_export_spec ,
111+ summary_op = None )
98112
99113def gen_init_fn ():
100114 """获取自定义初始化函数。
@@ -136,24 +150,34 @@ def init_from_checkpoint(scaffold, sess):
136150 print ('Accuracy for restored model:' )
137151 compute_accuracy (sess )
138152 return init_from_checkpoint
139-
153+
154+ _last_summary_step = 0
140155def train_fn (session , num_global_step ):
141156 global local_step , input_images , labels , accuracy
142157 global mnist , train_op , loss , global_step
143- global local_step
158+ global _summary_op , _summary_writer , _last_summary_step
144159
145160 start_time = time .time ()
146161 local_step += 1
147162 batch_xs , batch_ys = mnist .train .next_batch (100 )
148163 feed_dict = {input_images : batch_xs ,
149164 labels : batch_ys }
150- _ , loss_value , np_global_step = session .run (
151- [train_op , loss , global_step ],
165+ _ , loss_value , np_global_step , summary_str = session .run (
166+ [train_op , loss , global_step , _summary_op ],
152167 feed_dict = feed_dict )
153168 duration = time .time () - start_time
154169 if local_step % 50 == 0 :
155170 print ('Step {0}: loss = {1:0.2f} ({2:0.3f} sec), global step: {3}.' .format (
156171 local_step , loss_value , duration , np_global_step ))
172+
173+ # 每隔固定训练轮数计算保存一次模型 summary 信息
174+ # 通过 dist_base.cfg.save_summaies_steps 获取在 TaaS 平台上设置的
175+ # "自动保存 summaries 日志间隔"参数值。
176+ if (np_global_step - _last_summary_step >= dist_base .cfg .save_summaries_steps ):
177+ _summary_writer .add_summary (summary_str , np_global_step )
178+ _summary_writer .flush ()
179+ _last_summary_step = np_global_step
180+
157181 if local_step % 1000 == 0 :
158182 print ("Accuracy for validation data: {0:0.3f}" .format (
159183 session .run (
@@ -166,6 +190,9 @@ def train_fn(session, num_global_step):
166190
167191
168192def after_train_hook (session ):
193+ global _summary_writer
194+ _summary_writer .close ()
195+
169196 print ("Train done." )
170197 print ("Accuracy for test data: {0:0.3f}" .format (
171198 session .run (
0 commit comments