【发布时间】: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