错误表现:
WARNING:tensorflow:From ./eval_ssd_network.py:226: streaming_mean (from tensorflow.contrib.metrics.python.ops.metric_ops) is deprecated and will be removed in a future version.
Instructions for updating:
Please switch to tf.metrics.mean
INFO:tensorflow:Evaluating ./log/model.ckpt-40000
Traceback (most recent call last):
File "./eval_ssd_network.py", line 346, in <module>
tf.app.run()
File "/home/ligy/anaconda3/envs/tensorflow/lib/python3.6/site-packages/tensorflow/python/platform/app.py", line 126, in run
_sys.exit(main(argv))
File "./eval_ssd_network.py", line 320, in main
session_config=config)
File "/home/ligy/anaconda3/envs/tensorflow/lib/python3.6/site-packages/tensorflow/contrib/slim/python/slim/evaluation.py", line 212, in evaluate_once
config=session_config)
File "/home/ligy/anaconda3/envs/tensorflow/lib/python3.6/site-packages/tensorflow/python/training/evaluation.py", line 188, in _evaluate_once
eval_step_value = _get_latest_eval_step_value(eval_ops)
File "/home/ligy/anaconda3/envs/tensorflow/lib/python3.6/site-packages/tensorflow/python/training/evaluation.py", line 76, in _get_latest_eval_step_value
with ops.control_dependencies(update_ops):
File "/home/ligy/anaconda3/envs/tensorflow/lib/python3.6/site-packages/tensorflow/python/framework/ops.py", line 5027, in control_dependencies
return get_default_graph().control_dependencies(control_inputs)
File "/home/ligy/anaconda3/envs/tensorflow/lib/python3.6/site-packages/tensorflow/python/framework/ops.py", line 4631, in control_dependencies
c = self.as_graph_element(c)
File "/home/ligy/anaconda3/envs/tensorflow/lib/python3.6/site-packages/tensorflow/python/framework/ops.py", line 3590, in as_graph_element
return self._as_graph_element_locked(obj, allow_tensor, allow_operation)
File "/home/ligy/anaconda3/envs/tensorflow/lib/python3.6/site-packages/tensorflow/python/framework/ops.py", line 3679, in _as_graph_element_locked
types_str))
TypeError: Can not convert a tuple into a Tensor or Operation.
解决方法:
- 第1步:在 eval_ssd_network.py 文件中 main函数 前添加一个flatten函数
def flatten(x):
result = []
for el in x:
if isinstance(el, tuple):
result.extend(flatten(el))
else:
result.append(el)
return result
- 第2步:替换关键代码 <共有两处eval_op=list(names_to_updates.values()) >
将
eval_op=list(names_to_updates.values())
替换为
eval_op=flatten(list(names_to_updates.values()))
测试:
再次运行,错误消失,程序跑通~
参考资料:
[1]. SSD输出mAP时出现TypeError: Can not convert a tuple into a Tensor or Operation
[2]. TypeError: Can not convert a tuple into a Tensor or Operation.