You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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))

问题根源

  1. 初始NaN埋下隐患:你定义y = tf.Variable(x/n, name='y')时,x和n都是初始值为0的tf.constant,初始化y的瞬间就会计算0/0,直接得到NaN。
  2. 错误的变量更新逻辑:循环里的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:13:27