Tensorflow 上的简单线性回归
Tensorflow on simple linear regression
我是机器学习和tensorflow的初学者。在尝试张量流的第一步中,我尝试了一个简单的多元线性回归。但是,该模型似乎停留在局部最小值。这是我的代码。
import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt
def weight_variable(shape):
initial = tf.truncated_normal(shape, stddev=1)
return tf.Variable(initial)
# dataset
xx = np.random.randint(0,1000,[1000,3])/1000.
yy = xx[:,0] * 2 + xx[:,1] * 1.4 + xx[:,2] * 3
# model
x = tf.placeholder(tf.float32, shape=[None, 3])
y_ = tf.placeholder(tf.float32, shape=[None])
W1 = weight_variable([3, 1])
y = tf.matmul(x, W1)
# training and cost function
cost_function = tf.reduce_mean(tf.square(y - y_))
train_function = tf.train.AdamOptimizer(1e-2).minimize(cost_function)
# create a session
sess = tf.Session()
# train
sess.run(tf.initialize_all_variables())
for i in range(10000):
sess.run(train_function, feed_dict={x:xx, y_:yy})
if i % 1000 == 0:
print(sess.run(cost_function, feed_dict={x:xx, y_:yy}))
输出为:
14.8449
2.20154
2.18375
2.18366
2.18366
2.18366
2.18366
2.18366
2.18366
输出值 (yy) 的范围是 0 到 6,因此均方误差 2.18 相当大,因为数据集没有添加噪声。
我也尝试了学习率 0.1 和 1e-2 的 GradientDescentOptimizer,但它并没有改善结果。
我的实现有什么问题吗?
这是因为 y
与 y_
的形状不同。 y
的形状为 (1000, 1),y_
的形状为 (1000)。所以当你减去它们时,你无意中创建了一个二维矩阵。
要修复它,请将成本函数更改为:
cost_function = tf.reduce_mean(tf.square(tf.squeeze(y) - y_))
如另一个答案中所述,您必须使用
predictions = tf.add(b, tf.matmul(x, w))
error = tf.reduce_mean(tf.square(y - predictions))
正如您所说,您是 Tensorflow 初学者,您可以在此处查看示例:-
我是机器学习和tensorflow的初学者。在尝试张量流的第一步中,我尝试了一个简单的多元线性回归。但是,该模型似乎停留在局部最小值。这是我的代码。
import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt
def weight_variable(shape):
initial = tf.truncated_normal(shape, stddev=1)
return tf.Variable(initial)
# dataset
xx = np.random.randint(0,1000,[1000,3])/1000.
yy = xx[:,0] * 2 + xx[:,1] * 1.4 + xx[:,2] * 3
# model
x = tf.placeholder(tf.float32, shape=[None, 3])
y_ = tf.placeholder(tf.float32, shape=[None])
W1 = weight_variable([3, 1])
y = tf.matmul(x, W1)
# training and cost function
cost_function = tf.reduce_mean(tf.square(y - y_))
train_function = tf.train.AdamOptimizer(1e-2).minimize(cost_function)
# create a session
sess = tf.Session()
# train
sess.run(tf.initialize_all_variables())
for i in range(10000):
sess.run(train_function, feed_dict={x:xx, y_:yy})
if i % 1000 == 0:
print(sess.run(cost_function, feed_dict={x:xx, y_:yy}))
输出为:
14.8449
2.20154
2.18375
2.18366
2.18366
2.18366
2.18366
2.18366
2.18366
输出值 (yy) 的范围是 0 到 6,因此均方误差 2.18 相当大,因为数据集没有添加噪声。 我也尝试了学习率 0.1 和 1e-2 的 GradientDescentOptimizer,但它并没有改善结果。
我的实现有什么问题吗?
这是因为 y
与 y_
的形状不同。 y
的形状为 (1000, 1),y_
的形状为 (1000)。所以当你减去它们时,你无意中创建了一个二维矩阵。
要修复它,请将成本函数更改为:
cost_function = tf.reduce_mean(tf.square(tf.squeeze(y) - y_))
如另一个答案中所述,您必须使用
predictions = tf.add(b, tf.matmul(x, w))
error = tf.reduce_mean(tf.square(y - predictions))
正如您所说,您是 Tensorflow 初学者,您可以在此处查看示例:-