使用Tensorflow的多变量线性回归

时间:2017-04-20 19:22:11

标签: python-3.x tensorflow linear-regression

我正在尝试使用tensorflow实现多变量线性回归。我有一个200行和3列(功能)的csv文件,最后一列作为输出。这样的事情:enter image description here

我写了以下代码:

from __future__ import print_function

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
import csv
import pandas
rng = np.random


# Parameters
learning_rate = 0.01
training_epochs = 1000
display_step = 50

我使用pandas从文件中获取数据并存储它:

# Training Data
dataframe = pandas.read_csv("Advertising.csv", delim_whitespace=True, header=None)
dataset = dataframe.values

X1,X2,X3,y1 = [],[],[],[]
for i in range(1,len(dataset)):
    X = dataset[i][0]
    X1.append(np.float32(X.split(",")[1]))
    X2.append(np.float32(X.split(",")[2]))
    X3.append(np.float32(X.split(",")[3]))
    y1.append(np.float32(X.split(",")[4]))
X = np.column_stack((X1,X2))
X = np.column_stack((X,X3))

我分配了占位符和变量以及线性回归模型:

n_samples = len(X1)
#print(n_samples) = 17
# tf Graph Input
X_1 = tf.placeholder(tf.float32, [3, None])
Y = tf.placeholder(tf.float32, [None])

# Set model weights
W1 = tf.Variable(rng.randn(), [n_samples,3])
b = tf.Variable(rng.randn(), [n_samples])



# Construct a linear model
pred = tf.add(tf.matmul(W1, X_1), b)

# Mean squared error
cost = tf.reduce_sum(tf.pow(pred-Y, 2))/(2*n_samples)
# Gradient descent
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)

# Initializing the variables
init = tf.global_variables_initializer()

# Launch the graph
with tf.Session() as sess:
    sess.run(init)

    # Fit all training data
    for epoch in range(training_epochs):
        for (x1, y) in zip(X, y1):
            sess.run(optimizer, feed_dict={X_1: x1, Y: y})
        # Display logs per epoch step
        if (epoch+1) % display_step == 0:
            c = sess.run(cost, feed_dict={X_1: x1, Y: y})
            print("Epoch:", '%04d' % (epoch+1), "cost=", "{:.9f}".format(c), \
                "Weights=", sess.run(W1),"b=", sess.run(b))

我收到以下错误,我无法调试:

  

ValueError:Shape必须是等级2,但对于' MatMul'是0。 (OP:   ' MatMul')输入形状:[],[3,?]。

你可以帮我解决这个问题吗?

提前致谢。

2 个答案:

答案 0 :(得分:1)

tf.variable并不像你想的那样接受输入,第二个参数不是形状。要设置变量的形状,请使用初始化程序(第一个参数)执行此操作。见https://www.tensorflow.org/api_docs/python/tf/Variable

您的代码

# Set model weights
W1 = tf.Variable(rng.randn(), [n_samples,3])
b = tf.Variable(rng.randn(), [n_samples])

我的建议更改

initial1 = tf.constant(rng.randn(), dtype=tf.float32, shape=[n_samples,3])
initial2 = tf.constant(rng.randn(), dtype=tf.float32, shape=[n_samples,3])
W1 = tf.Variable(initial_value=initial1) 
b = tf.Variable(initial_value=initial2)

为了解决修复初始问题后出现的其他问题,以下代码运行 - 但仍有一些逻辑错误需要考虑 - 比如每个纪元步骤的#display日志。

from __future__ import print_function

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
import csv
import pandas
rng = np.random


# Parameters
learning_rate = 0.01
training_epochs = 1000
display_step = 50
# Training Data
#Created some fake data
dataframe = [[230.1,37.8,69.2,22.1],[2230.1,32.8,61.2,21.1]] #pandas.read_csv("Advertising.csv", delim_whitespace=True, header=None)
dataset = dataframe

X1,X2,X3,y1 = [],[],[],[]
for i in range(0,len(dataset)):
    X = dataset[i][0]
    X1.append(np.float32(dataset[i][0]))
    X2.append(np.float32(dataset[i][1]))
    X3.append(np.float32(dataset[i][2]))
    y1.append(np.float32(dataset[i][3]))
#X=np.array([X1,X2,X3])
X = np.column_stack((X1,X2,X3)) ##MYEDIT: This combines all three values. If you find you need to stack in a different way then you will need to ensure the shapes below match this shape.
#X = np.column_stack((X,X3))

n_samples = len(X1)
#print(n_samples) = 17
# tf Graph Input
X_1 = tf.placeholder(tf.float32, [ None,3])##MYEDIT: Changed order
Y = tf.placeholder(tf.float32, [None])
# Set model weights
initial1 = tf.constant(rng.randn(), dtype=tf.float32, shape=[3,1]) ###MYEDIT: change order and you are only giving 1 sample at a time with your method of calling
initial2 = tf.constant(rng.randn(), dtype=tf.float32, shape=[3,1])
W1 = tf.Variable(initial_value=initial1)
b = tf.Variable(initial_value=initial2)


mul=tf.matmul(W1, X_1)   ##MYEDIT: remove matmul from pred for clarity and shape checking
# Construct a linear model
pred = tf.add(mul, b)

# Mean squared error
cost = tf.reduce_sum(tf.pow(pred-Y, 2))/(2*n_samples)
# Gradient descent
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)

# Initializing the variables
init = tf.global_variables_initializer()

# Launch the graph
with tf.Session() as sess:
    sess.run(init)

    # Fit all training data
    for epoch in range(training_epochs):
        for (x1, y) in zip(X, y1):
            Xformatted=np.array([x1])  #has shape (1,3)  #MYEDIT: separated this to demonstrate shapes
            yformatted=np.array([y])  #shape (1,)  #MYEDIT: separated this to demonstrate shapes
                                                    #NB. X_1 shape is (?,3)   and Y shape is (?,)
            sess.run(optimizer, feed_dict={X_1: Xformatted, Y: yformatted})
        # Display logs per epoch step
        if (epoch+1) % display_step == 0:
            c = sess.run(cost, feed_dict={X_1: Xformatted, Y: yformatted})   #NB. x1 an y are out of scope here - you will only get the last values. Double check if this is what you meant.
            print("Epoch:", '%04d' % (epoch+1), "cost=", "{:.9f}".format(c), \
                "Weights=", sess.run(W1),"b=", sess.run(b))

答案 1 :(得分:0)

您需要将矩阵输入tf.matmul(W1, X_1)。检查代码的W1X_1类型。

See the question here了解更多详情