TensorFlow实践:线性回归
说明
通过生成人工数据集合,基于TensorFlow实现线性回归
产生数据
利用随机数在直线y=2.321*x+1.564的基础上,加上一定的噪音,产生在(-1,1)范围的数据。
np.random.seed(5)
x_data = np.linspace(-1,1,100)
#2.321*x+1.564
W0 = 2.321
B0 = 1.564
y_data = W0 * x_data + B0 + np.random.randn(*x_data.shape)*0.4
构建模型
x = tf.placeholder("float",name = "x")
y = tf.placeholder("float",name = "y")
def model(x,w,b):
return tf.multiply(x,w)+b
w = tf.Variable(1.0,name = "w0")
b = tf.Variable(0.0,name = "b0")
pred = model(x,w,b)
train_epochs = 10
learning_rate = 0.05
loss_function = tf.reduce_mean(tf.square(y-pred))
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss_function)
x,y是两个占位符,用于保存训练过程中的数据,w,b是两个变量,训练就是不断地改变这两个值,以使模型达到最好。
train_epochs和learning_rate是两个超参数,分别表示训练的总次数,这两个参数可以根据训练的效果来改变。
loss_function是损失函数,程序的目标就是让这个损失函数的值最小,这里用的是模型的输出值与输入的数据y之间的差的平方的平均数来表示,optimizer是优化器,这里采用的是梯度下降算法。
训练模型
sess = tf.Session()
init = tf.global_variables_initializer()
sess.run(init)
for epoch in range(train_epochs):
for xi,yi in zip(x_data,y_data):
_,loss = sess.run([optimizer,loss_function],feed_dict={x:xi,y:yi})
训练模型时,先启动会话,然后初始化变量,之后就是正式的去训练模型,即在每个轮次中,通过feed_dict函数,将数据喂给模型,模型就可以根据这些数据来训练。
完整代码
import matplotlib.pyplot as plt
import numpy as np
import tensorflow as tf
np.random.seed(5)
x_data = np.linspace(-1,1,100)
#2.321*x+1.564
W0 = 2.321
B0 = 1.564
y_data = W0 * x_data + B0 + np.random.randn(*x_data.shape)*0.4
#图像显示
plt.figure("Image1")
plt.rcParams['figure.figsize'] = (10, 6)
plt.scatter(x_data,y_data)
plt.plot(x_data,W0* x_data + B0,'red')
#构建模型
x = tf.placeholder("float",name = "x")
y = tf.placeholder("float",name = "y")
def model(x,w,b):
return tf.multiply(x,w)+b
w = tf.Variable(1.0,name = "w0")
b = tf.Variable(0.0,name = "b0")
pred = model(x,w,b)
train_epochs = 10
learning_rate = 0.05
loss_function = tf.reduce_mean(tf.square(y-pred))
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss_function)
sess = tf.Session()
init = tf.global_variables_initializer()
plt.figure("Image2")
sess.run(init)
for epoch in range(train_epochs):
for xi,yi in zip(x_data,y_data):
_,loss = sess.run([optimizer,loss_function],feed_dict={x:xi,y:yi})
w_temp = w.eval(session = sess)
b_temp = b.eval(session = sess)
plt.plot(x_data,w_temp*x_data + b_temp)
print("原直线:","w:",W0," b:",B0)
print("训练结果:","w:",sess.run(w)," b:",sess.run(b))