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

TensorFlow训练后获取变量m、q值返回NaN的技术求助

解决TensorFlow线性回归中m、q输出[nan, nan]的问题

嘿,我一眼就看到几个可能导致你得到NaN的问题,咱们一步步来排查和解决:

1. 最可能的元凶:训练数据里有缺失值(NaN)

如果你的train.csv里存在缺失的x或y值,TensorFlow的计算会直接把NaN传播到整个计算图里,最终导致m和q变成NaN。先做个简单的检查:

train = pd.read_csv("train.csv")
print(train.isnull().sum())

如果输出显示有缺失值,直接删掉这些行:

train = train.dropna()

2. 代码里的变量覆盖问题

你在这一行犯了个小错误:

_, m, q = sess.run([gdescent, m, q], feed_dict={X: train['x'].values, y: train['y'].values})

这里你用sess.run返回的数值覆盖了原本定义的tf.Variable对象m和q,虽然这不是NaN的直接原因,但会让后续如果想继续训练的话完全无法进行。改成这样:

_, m_val, q_val = sess.run([gdescent, m, q], feed_dict={X: train['x'].values, y: train['y'].values})

用m_val和q_val来存储当前的变量值,保留原始的m和q变量。

3. 只运行一次梯度下降远远不够

你现在只执行了一次梯度更新,模型根本还没开始学习。如果数据本身没问题,一次迭代也可能因为初始参数和数据的匹配度太差,加上学习率不合适导致NaN。改成循环多次训练:

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    # 跑1000次迭代
    for step in range(1000):
        _, current_cost, m_val, q_val = sess.run(
            [gdescent, cost, m, q], 
            feed_dict={X: train['x'].values, y: train['y'].values}
        )
        # 每100次打印一次损失,看看训练情况
        if step % 100 == 0:
            print(f"Step {step}: 损失 = {current_cost:.2f}")
    print(f"训练完成后,m = {m_val:.4f}, q = {q_val:.4f}")

4. 学习率可能过大导致梯度爆炸

你的x值范围大概在0-100左右,学习率设为0.01可能太大了,一次参数更新的幅度过大直接让参数变成NaN。可以试试把学习率调低到0.001,或者先对x做归一化处理(推荐):

# 对x做标准化
x_mean = train['x'].mean()
x_std = train['x'].std()
train['x_normalized'] = (train['x'] - x_mean) / x_std

# 训练时用归一化后的x
feed_dict={X: train['x_normalized'].values, y: train['y'].values}

如果用了归一化,最后可以把参数还原回原始尺度:

original_m = m_val / x_std
original_q = q_val - (m_val * x_mean / x_std)
print(f"原始尺度下的m: {original_m:.4f}, q: {original_q:.4f}")

把这些点都修正后,应该就能得到正常的m和q值了。

内容的提问来源于stack exchange,提问作者Elia Perantoni

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:36:09