TensorFlow中Variable输出NaN求助:滚动平均值计算异常
问题:TensorFlow中滚动平均值计算始终输出NaN的原因及解决办法
你遇到的问题很典型,咱们先拆解你的代码,看看问题到底出在哪:
import tensorflow as tf import numpy as np x = tf.constant(0, name='x') n = tf.constant(0, name='n') y = tf.Variable(x/n, name='y') model = tf.global_variables_initializer() with tf.Session() as session: session.run(model) for i in range(5): x = x + np.random.randint(1000) n = n + 1 print(session.run(x)) print(session.run(n)) print(session.run(y))
问题根源
- 初始NaN埋下隐患:你定义
y = tf.Variable(x/n, name='y')时,x和n都是初始值为0的tf.constant,初始化y的瞬间就会计算0/0,直接得到NaN。 - 错误的变量更新逻辑:循环里的
x = x + np.random.randint(1000)和n = n + 1,本质是把原来的TensorFlow张量替换成了普通Python数值,根本没修改TensorFlow计算图里的x、n节点。也就是说,每次session.run(y)时,还是在用最初的x(0)和n(0)计算,自然一直输出NaN。
修正方案
要解决这个问题,得用TensorFlow的变量机制来管理x和n,通过官方的赋值操作更新它们,让y的计算逻辑关联到最新的变量值:
import tensorflow as tf import numpy as np # 用tf.Variable替代tf.constant,支持后续更新 x = tf.Variable(0, name='x', dtype=tf.int32) n = tf.Variable(0, name='n', dtype=tf.int32) # 将y定义为动态计算的张量,而非固定的初始化值 y = tf.cast(x, tf.float32) / tf.cast(n, tf.float32) with tf.Session() as session: session.run(tf.global_variables_initializer()) for i in range(5): # 用assign_add完成TensorFlow变量的合法更新 session.run(x.assign_add(np.random.randint(1000))) session.run(n.assign_add(1)) print("x:", session.run(x)) print("n:", session.run(n)) print("y:", session.run(y))
关键修改说明
- 把x、n改成
tf.Variable:这是TensorFlow中可更新状态的载体,constant是只读的,没法修改。 - 动态定义y:不再把y初始化为固定值,而是让它每次运行时都取最新的x和n计算,保证逻辑同步。
- 使用
assign_add更新变量:这是TensorFlow官方推荐的变量更新方式,能正确修改计算图中的变量状态。 - 加入
tf.cast类型转换:把整数转为浮点数,避免整数除法带来的精度丢失问题。
这样修改后,y就能正确输出每次的滚动平均值了。
内容的提问来源于stack exchange,提问作者Sahand
相关产品推荐
相关产品推荐

