【问题标题】:Minor changes produce nan error in tensorflow细微的变化会在张量流中产生 nan 错误
【发布时间】:2019-07-29 23:40:18
【问题描述】:

我是张量流的初学者。我对一篇文章的代码进行了一些细微的更改,但权重是 nan。我在这里发布了正确的代码和修改后的代码。请帮我找出问题所在。 正确代码:

import tensorflow as tf    
import numpy as np
import pandas as pd
df=pd.read_csv('D:/newcars.csv')
# mileage, cylinder,doors are placeholders for our training data
mileage = tf.placeholder("float")
cylinder = tf.placeholder("float")
doors = tf.placeholder("float")
price = tf.placeholder("float")
a=tf.Variable(1.0)
b=tf.Variable(1.0)
c=tf.Variable(1.0)
d=tf.Variable(1.0)

y_model = tf.multiply(mileage, a) + tf.multiply(cylinder, b) + 
tf.multiply(doors, c) + d
error = tf.square(price - y_model)
train_op = tf.train.GradientDescentOptimizer(0.5).minimize(error)

model = tf.global_variables_initializer()

with tf.Session() as session:
session.run(model)
for i in range(len(df)):        
    mileage_value = np.random.rand()
    cylinder_value = np.random.rand()
    doors_value = np.random.rand()
    price_value = 2*mileage_value+ 3*cylinder_value+4*doors_value+1

    print(str(mileage_value) + ' ' + str(cylinder_value) + ' ' + 
    str(doors_value) + ' ' + str(price_value))

    session.run(train_op, feed_dict={mileage: mileage_value, cylinder: 
    cylinder_value,doors:doors_value,price:price_value})
    a_value = session.run(a)
    b_value = session.run(b)
    c_value = session.run(c)
    d_value = session.run(d)
    print(str(a_value)+' ' + str(b_value)+ ' ' + str(c_value) + ' ' + 
    str(d_value))

修改后的代码: 我只是换了

mileage_value = np.random.rand()
cylinder_value = np.random.rand()
doors_value = np.random.rand()
price_value = 2*mileage_value+ 3*cylinder_value+4*doors_value+1

与:

mileage_value = df.loc[i]['Mileage']
cylinder_value = df.loc[i]['Cylinder']
doors_value = df.loc[i]['Doors']
price_value = df.loc[i]['Price']

尽管mileage_value、cylinder_value、doors_value 和price_value 都是正确的,但还是发生了nan 错误。

【问题讨论】:

  • 您确定您的df.loc[i]['Category'] 值是数字吗?例如,它们不是字符串吗?这可以解释你的 nan 错误。
  • 是的,它们都是数字。它们的类型是 int64。我尝试使用下面的代码但仍然无法正常工作:mileage_value = float(df.loc[i]['Mileage']) cylinder_value = float(df.loc[i]['Cylinder']) door_value = float(df. loc[i]['Doors']) price_value = float(df.loc[i]['Price'])
  • 当我调试时,我看到权重已更新,但我不知道为什么打印语句显示修改后的代码的“nan”,而它与原始代码正确。
  • 终于找到了问题的根本原因。这是由于初始权重和学习率选择不当造成的。在正确的代码中,这些初始值不会影响结果,因为输入数据的波动幅度很小。因此,经过几次第一次迭代后,权重会更新,但直到某些点这些权重非常小并变为 inf 或 nan。
  • 我对输入数据进行归一化处理后,模型可以得出预期的结果。

标签: tensorflow nan


【解决方案1】:

我终于找到了问题的根本原因。原因是我没有规范化输入数据。因此,输入数据的波动幅度是巨大的。结果,在几次第一次迭代之后,权重被更新,但直到某个时候,这些权重变得如此之小或如此之大,最终它们变成了 inf 或 nan。 在我对输入数据进行归一化后,模型可以得出预期的结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-07
    • 2018-10-31
    • 1970-01-01
    • 2018-12-07
    • 2021-01-14
    • 1970-01-01
    • 1970-01-01
    • 2018-06-21
    相关资源
    最近更新 更多