当前位置: 首页 > 知识库问答 >
问题:

如何在Tensorflow中获得线性回归的正确答案?

何飞翰
2023-03-14

我没有得到线性回归问题的输出。这是一个简单的单变量线性回归问题。我使用了Kaggle的线性回归数据集,
从这里开始:随机数据集上的线性回归

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

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值。

共有2个答案

司徒嘉祥
2023-03-14

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

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

第三,在玩你的代码时,我发现GradientDescentOptimizer在给定的学习率和一些我手动尝试的情况下似乎做得不好,尽管我真的认为应该这样,meh<但是,code>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])
邓光赫
2023-03-14

您尚未指定任何权重和偏差。你把你的体重定义为

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\u dim,out\u dim],对于b将是[out\u dim]。检查tf。random_normal文档,这里的第一个参数是所需张量的形状。

 类似资料:
  • 在本章中,将重点介绍使用TensorFlow进行线性回归实现的基本示例。逻辑回归或线性回归是用于对离散类别进行分类的监督机器学习方法。在本章中的目标是构建一个模型,用户可以通过该模型预测预测变量与一个或多个自变量之间的关系。 这两个变量之间的关系是线性的。如果是因变量的变化而变化,那么可将认为是自变量,那么两个变量的线性回归关系将如下式所示: 接下来将设计一种线性回归算法。需要了解以下两个重要概念

  • 我正在运行我在buitin网站上看到的一个关于张量流线性回归的代码,它总是给我一个错误,我不知道代码有什么问题。首先我以为这是我的ide,然后当我切换到jupyter实验室时,它显示了我在这一点上的错误 首先我以为这是我的ide,然后当我切换到jupyter实验室时,它显示了我在这一点上的错误

  • 我有一些数据比如 在 我正试图对此进行线性回归,即试图找到趋势线的斜率和(y-)截距,以及斜率中的不确定性和截距中的不确定性。 当我画趋势线时,谷歌图表应用编程接口已经找到了斜率和截距值,但是我不确定如何找到不确定性。 我一直在使用中的函数来执行此操作,但我发现这非常麻烦,因为我的所有数据都在中。 所以我的问题是,如何使用找到中得到的两个不确定性值? 我很抱歉问了这样一个基本的问题。 我在和方面很

  • 本文向大家介绍如何在python中实现线性回归,包括了如何在python中实现线性回归的使用技巧和注意事项,需要的朋友参考一下 线性回归是基本的统计和机器学习技术之一。经济,计算机科学,社会科学等等学科中,无论是统计分析,或者是机器学习,还是科学计算,都有很大的机会需要用到线性模型。建议先学习它,然后再尝试更复杂的方法。 本文主要介绍如何逐步在Python中实现线性回归。而至于线性回归的数学推导、

  • 线性回归是最简单的回归方法,它的目标是使用超平面拟合数据集,即学习一个线性模型以尽可能准确的预测实值输出标记。 单变量模型 模型 $$f(x)=w^Tx+b$$ 在线性回归问题中,一般使用最小二乘参数估计($$L_2$$损失),定义目标函数为 $$J={\arg min}{(w,b)}\sum{i=1}^{m}(y_i-wx_i-b)^2$$ 均方误差(MSE) $$MSE = \frac{1}{

  • 线性回归输出是一个连续值,因此适用于回归问题。回归问题在实际中很常见,如预测房屋价格、气温、销售额等连续值的问题。与回归问题不同,分类问题中模型的最终输出是一个离散值。我们所说的图像分类、垃圾邮件识别、疾病检测等输出为离散值的问题都属于分类问题的范畴。softmax回归则适用于分类问题。 由于线性回归和softmax回归都是单层神经网络,它们涉及的概念和技术同样适用于大多数的深度学习模型。我们首先