TensorFlow报错:'NoneType'对象不可迭代,求排查解决
解决TensorFlow中
sess.run()的TypeError: 'NoneType' object is not iterable问题 我一眼就看出问题出在哪了——你在解构sess.run()的返回值时犯了个小逻辑错误!
错误根源
你写了:
_ , loss_val = sess.run(tr_op, feed_dict=feed_dict)
但tr_op是一个Operation类型(从你的输出<class 'tensorflow.python.framework.ops.Operation'>可以确认),TensorFlow中执行Operation时,sess.run()只会返回None(因为Operation本身没有可输出的张量)。而你试图把这个None拆成两个变量(_和loss_val),这就相当于尝试迭代一个None对象,自然会触发TypeError。
你的feed_dict完全没问题(是可迭代的dict类型),tr_op的类型也正确,问题根本不在这俩身上,而是返回值的解构逻辑错了。
解决方案
你想要获取loss_val,说明你肯定定义了一个loss张量(比如loss = tf.reduce_mean(...)这类代码)。你需要把训练操作tr_op和loss张量一起传入sess.run(),这样run会返回一个包含两个元素的列表:第一个是tr_op执行的结果(还是None),第二个是loss的计算值,这样解构赋值就合法了。
修改后的代码应该是这样:
# 假设你已经定义了名为loss的张量 _ , loss_val = sess.run([tr_op, loss], feed_dict=feed_dict)
额外说明
如果你不想接收tr_op的返回值,也可以分开执行,但这种方式需要两次会话调用,效率更低:
# 先执行训练操作 sess.run(tr_op, feed_dict=feed_dict) # 再获取loss值 loss_val = sess.run(loss, feed_dict=feed_dict)
显然第一种一次性传入列表的方式更高效,也更符合TensorFlow的最佳实践。
内容的提问来源于stack exchange,提问作者Xander May
相关产品推荐
相关产品推荐

