使用tf.compat.v1.summary.merge_all()合并摘要时出现NoneType错误
问题:tf.compat.v1.summary.merge_all()返回None引发TypeError错误
在调用tf.compat.v1.summary.merge_all()合并摘要时,self._summaries被赋值为None,最终触发以下错误:
File "main.py", line 216, in <module> tf.compat.v1.app.run() File "/apps/codes/anaconda3/envs/myenv2/lib/python3.6/site-packages/tensorflow/python/platform/app.py", line 40, in run _run(main=main, argv=argv, flags_parser=_parse_flags_tolerate_undef) File "/apps/codes/anaconda3/envs/myenv2/lib/python3.6/site-packages/absl/app.py", line 312, in run _run_main(main, args) File "/apps/codes/anaconda3/envs/myenv2/lib/python3.6/site-packages/absl/app.py", line 258, in _run_main sys.exit(main(argv)) File "main.py", line 203, in main setup_training(hps.mode, generator, discriminator, generator_batcher, discriminator_batcher, generator_val_batcher, discriminator_val_batcher) File "main.py", line 160, in setup_training trainer.adversarial_train(generator, discriminator, generator_batcher, discriminator_batcher, generator_val_batcher, discriminator_val_batcher, summary_writer, sess_context_manager) File "/home/20bce120/tf2/trainer.py", line 106, in adversarial_train result_train = generator.run_train_step(sess, batch) File "/home/20bce120/tf2/generator.py", line 636, in run_train_step return sess.run(to_return, feed_dict) File "/apps/codes/anaconda3/envs/myenv2/lib/python3.6/site-packages/tensorflow/python/client/session.py", line 968, in run run_metadata_ptr) File "/apps/codes/anaconda3/envs/myenv2/lib/python3.6/site-packages/tensorflow/python/client/session.py", line 1176, in _run self._graph, fetches, feed_dict_tensor, feed_handles=feed_handles) File "/apps/codes/anaconda3/envs/myenv2/lib/python3.6/site-packages/tensorflow/python/client/session.py", line 487, in __init__ self._fetch_mapper = _FetchMapper.for_fetch(fetches) File "/apps/codes/anaconda3/envs/myenv2/lib/python3.6/site-packages/tensorflow/python/client/session.py", line 270, in for_fetch return _DictFetchMapper(fetch) File "/apps/codes/anaconda3/envs/myenv2/lib/python3.6/site-packages/tensorflow/python/client/session.py", line 419, in __init__ _FetchMapper.for_fetch(fetch) for fetch in fetches.values() File "/apps/codes/anaconda3/envs/myenv2/lib/python3.6/site-packages/tensorflow/python/client/session.py", line 419, in <listcomp> _FetchMapper.for_fetch(fetch) for fetch in fetches.values() File "/apps/codes/anaconda3/envs/myenv2/lib/python3.6/site-packages/tensorflow/python/client/session.py", line 265, in for_fetch (fetch, type(fetch))) TypeError: Fetch argument None has invalid type <class 'NoneType'>
相关代码片段
def build_graph(self): tf.logging.info('Building graph...') t0 = time.time() self._add_placeholders() self._add_seq2seq() self.global_step = tf.Variable(0, name='global_step', trainable=False) if self._hps.mode == 'train'or self._hps.mode == 'pretrain': self._add_train_op() self._rollout() self._summaries = tf.compat.v1.summary.merge_all() tf.logging.info('Time to build graph: %i seconds', time.time() - t0)
解决方法
确保摘要节点已被正确创建
tf.compat.v1.summary.merge_all()仅能合并当前默认图中已存在的摘要节点(如tf.compat.v1.summary.scalar、tf.compat.v1.summary.histogram)。检查_add_train_op()或其他方法中是否已显式添加所需的摘要节点,比如在损失计算后添加标量摘要:# 在_add_train_op()函数内添加 tf.compat.v1.summary.scalar('training_loss', self.loss)添加None值兜底逻辑
即使确保了摘要节点存在,也可以通过兜底逻辑避免self._summaries为None:# 替换原merge_all调用代码 self._summaries = tf.compat.v1.summary.merge_all() if self._summaries is None: # 创建空摘要节点,避免后续sess.run()报错 self._summaries = tf.compat.v1.summary.merge([])确认模式分支的代码执行
若摘要节点仅在train/pretrain模式下创建,需确认当前运行的self._hps.mode确实属于这两种模式,否则不会生成任何摘要节点,导致merge_all()返回None。
内容的提问来源于stack exchange,提问作者Monil Modi
相关产品推荐
相关产品推荐

