【问题标题】:How to get the correct answer for Linear Regression in Tensorflow?如何在 Tensorflow 中获得线性回归的正确答案?
【发布时间】:2018-08-27 07:39:18
【问题描述】:

我没有得到关于线性回归问题的输出。 这是一个简单的单变量线性回归问题。 我使用过 Kaggle 的线性回归数据集,
从这里:Linear Regression on Random Dataset

它没有给出期望的输出。它给出了权重和偏差的 nan 值

import tensorflow as tf
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd


# In[20]:


#Getting DataFrames
train_data = pd.read_csv('train.csv')
test_data = pd.read_csv('test.csv')

#Dropping NaN rows
train_data.dropna()
test_data.dropna()

#Getting features and labels
X_train = train_data.iloc[:,0].values
Y_train = train_data.iloc[:,1].values

test_X = test_data.iloc[:,0].values
test_Y = test_data.iloc[:,1].values

#Plotting Training Data
plt.scatter(X_train,Y_train)


# In[58]:


#Training the model

X = tf.placeholder(tf.float32,name='X')
Y = tf.placeholder(tf.float32,name='Y')

W = tf.Variable(tf.random_normal([]),dtype=tf.float32,name='weights')
b = tf.Variable(tf.random_normal([]),dtype=tf.float32,name='bias')

Y_pred = W*X + b

cost = tf.square(Y_pred,name='cost')

optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.001).minimize(cost)
init = tf.global_variables_initializer()


# In[61]:


with tf.Session() as sess:
    sess.run(init)
    for i in range(1000):
        sess.run(optimizer,feed_dict={X:X_train,Y:Y_train})
    W_out,b_out = sess.run([W,b])
    writer = tf.summary.FileWriter('./graphs/linear_reg', sess.graph)


print(W_out,b_out)


# In[60]:


#plt.plot(X_train, W_out*X_train + b_out, color='red')
plt.scatter(X_train,Y_train)
plt.plot(X_train, W_out*X_train + b_out, color='red')

它正在输出:

nan nan

权重和偏差正在获取 nan 值。

【问题讨论】:

    标签: python-3.x tensorflow machine-learning linear-regression nan


    【解决方案1】:

    首先,在你的成本函数中有一个小错误,它可能应该是cost = tf.reduce_mean(tf.square(Y_pred - Y,name='cost'))

    第二,layog有一个点,定义参数时要提供Wb的形状。无论如何,由于您使用的是Y_pred = W*X + b,因此避免了tf.matmul,使用新的成本函数,不明确提供形状确实有效。

    第三,使用你的代码我发现GradientDescentOptimizer 在给定的学习率下似乎表现不佳,我手动尝试了一些,尽管我真的认为应该这样做,嗯。不过AdamOptimizer 没问题。

    下面的代码稍微调整了您的示例并且应该可以工作:

    # casting data into rank-2 form for tensorflow
    X_train = X_train.reshape((-1,1))
    test_X = test_X.reshape((-1,1))
    
    Y_train = Y_train.reshape((-1,1))
    test_Y = test_Y.reshape((-1,1))
    
    tf.reset_default_graph()
    
    D = X_train.shape[1] # number of non-bias features
    
    #Training the model
    X = tf.placeholder(tf.float32, shape=(None,D), name='X')
    Y = tf.placeholder(tf.float32, shape=(None,1), name='Y')
    
    # with explicit definition of shapes
    # W = tf.Variable(tf.random_normal([D,1], mean=0., stddev=1.), dtype=tf.float32, name='weights')
    # b = tf.Variable(tf.random_normal([1], mean=0., stddev=1.), dtype=tf.float32, name='bias')
    
    # without explicit definition of shapes
    W = tf.Variable(tf.random_normal([], mean=0., stddev=1.), dtype=tf.float32, name='weights')
    b = tf.Variable(tf.random_normal([], mean=0., stddev=1.), dtype=tf.float32, name='bias')
    
    #Y_pred = tf.matmul(X,W) + b # doesn't like undefined shapes
    Y_pred = X*W + b # fine with undefined shapes
    error = Y_pred - Y
    cost = tf.reduce_mean(tf.square(error), name="cost")
    
    # optimizer = tf.train.GradientDescentOptimizer(learning_rate=1e-3)
    optimizer = tf.train.AdamOptimizer(learning_rate=1e-1)
    update = optimizer.minimize(cost)
    
    init = tf.global_variables_initializer()
    
    Niter = 500
    Nprint = 50
    with tf.Session() as sess:
    
        sess.run(init)
    
        for i in range(Niter):
            sess.run(update, feed_dict={X:X_train, Y:Y_train})
            if i%Nprint == 0:
                print("\n%i/%i" % (i+1,Niter))
                print("W",W.eval())
                print("b",b.eval())
                print("cost",cost.eval(feed_dict={X:X_train, Y:Y_train}))
    
        W_out, b_out = sess.run([W, b])
    

    【讨论】:

      【解决方案2】:

      您没有分配任何权重和偏差。您将权重定义为

      W = tf.Variable(tf.random_normal([]),dtype=tf.float32,name='weights')
      b = tf.Variable(tf.random_normal([]),dtype=tf.float32,name='bias')
      

      这里,tf.random_normal 的输入是一个空数组。所以,Wb 都是空的。您需要指定Wb 的形状,W 的形状为[in_dim, out_dim]b 的形状为[out_dim]。查看tf.random_normal 文档,这里第一个参数是所需张量的形状。

      【讨论】:

        猜你喜欢
        • 2018-05-28
        • 2018-12-20
        • 1970-01-01
        • 1970-01-01
        • 2022-01-22
        • 2019-09-28
        • 1970-01-01
        • 2019-08-19
        • 2018-02-08
        相关资源
        最近更新 更多