我正在尝试使用tensorflow实现多变量线性回归 . 我有一个200行和3列(功能)的csv文件,最后一列作为输出 . 像这样:
我写了以下代码:
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'(op:'MatMul'),输入形状为[],[3,?] .
你可以帮我解决这个问题吗?
提前致谢 .
2 回答
tf.variable不会像你想的那样接受输入,第二个参数不是形状 . 要设置变量的形状,请使用初始化程序(第一个参数)执行此操作 . 见https://www.tensorflow.org/api_docs/python/tf/Variable
你的代码
我的建议改变
为了解决修复初始问题后出现的其他问题,以下代码运行 - 但仍然可能存在一些您需要考虑的逻辑错误 - 例如每个纪元步骤的#display日志 .
您需要将矩阵输入
tf.matmul(W1, X_1)
. 检查代码的W1
和X_1
的类型 .See the question here了解更多详情