训练集是生成的随机数,x和y的对应关系是y=2x。先生成100个随机数x,然后再计算出y=2x,并在结果上加上一些噪声,测试线性回归模型能否拟合好出y=2x。
1、代码如下:
import tensorflow as tf #导入TensorFlow模块
import numpy as np
import matplotlib.pyplot as plt
train_X=np.linspace(-1,1,100) #产生训练样本X.函数np.linspace用于产生随机数,5个参数,常用前三个,前两个代表产生随机数的范围,第三个代表数目,默认50.
train_Y=2*train_X+np.random.randn(*train_X.shape)*0.3 #y=2x,第二部分用于产生维度一样的随机数作为噪声
#显示模拟数据产生情况
plt.plot(train_X,train_Y,'ro',label='Organinal data')
plt.legend()
plt.show()
#创建模型
#占位符
X=tf.placeholder("float")
Y=tf.placeholder("float")
#模型参数
W=tf.Variable(tf.random_normal([1]),name='weight') #tf.random_normal()函数的参数,形状必选。这里指的是一个数,函数的作用是产生一个随机数
b=tf.Variable(tf.zeros([1]),name='bias') #tf.Variable函数要初始化
#前向结构
Z=np.multiply(X,W)+b #z是预测值
#反向优化
cost=tf.reduce_mean(tf.square(Y-Z)) #tf.reduce_mean计算平矩阵
learn_rate=0.01
optimizer=tf.train.GradientDescentOptimizer(learn_rate).minimize(cost)
#初始化所有变量
init=tf.global_variables_initializer()#先写上初始化,然后再在sess.run()里面调用
#定义迭代次数
training_epochs=20
#启动session
with tf.Session() as sess:#用with tf.Session() as sess的好处是不需要手动关闭上下文
sess.run(init) #先初始化
plotdata={"epoch_num":[],"loss":[]} #存放迭代次数值和损失值
#向模型注入数据
for epoch in range(training_epochs):
for(x,y) in zip(train_X,train_Y): #利用zip函数实现特征和标签的关联,zip函数返回一个元组列表,也就是返回的是个列表,列表元素是一个个元组
sess.run(optimizer,feed_dict={X:x,Y:y})
#显示训练中的详细信息
loss=sess.run(cost,feed_dict={X:train_X,Y:train_Y})
print("Epoch:",epoch+1,"cost=",loss,"W=",sess.run(W),"b=",sess.run(b))
if not (loss=="NA"):
plotdata["epoch_num"].append(epoch)
plotdata["loss"].append(loss)
print("Finished!")
print("cost=",sess.run(cost,feed_dict={X:train_X,Y:train_Y}),"W=",sess.run(W),"b=",sess.run(b))
#模型可视化
#这里要注意,设计sess的都要在with session as sess里面
plt.plot(train_X,train_Y,'ro',label='Origal data')
plt.plot(train_X,sess.run(W)*train_X+sess.run(b),label='Fittedline') #这样写可以显示到一个图里面
plt.legend()
plt.show()
#显示梯度损失函数
plt.plot(plotdata["epoch_num"],plotdata["loss"],'ro')
plt.legend()
plt.show()
#测试
print("x=0.2,z=",sess.run(Z,feed_dict={X:0.2}))
2、实验结果:
生成的原始数据图:
拟合的函数图像:
损失函数图像: