实验题目
假设有一组数据集,满足对应关系y=2x+1。要求训练一个模型,输入x,输出对应的y。
要求:随机生成一组从-1到1的100个随机数。
显示随机数据集线性图
实验过程
导入相关库
会输出自己安装的tensorflow的版本号,我的是2版本的,所以要加上compat.v1来来过度一下
import tensorflow.compat.v1 as tf
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
print("Tensorflow版本是:",tf.__version__)
生成数据集
先生成输入数据,需要构造满足这个函数的x和y,同时要加入一些实际影响因素:噪声
x_data = np.linspace(-1,1,100)
np.random.seed(5) #设置随机数种子
y_data = 2*x_data + 1.0 + np.random.randn(*x_data.shape) * 0.4
np.random.randn(*x_data.shape) * 0.4就是噪声,噪声的维度与x_data一致
np.random.randn(10)
x_data.shape
x_data,y_data
利用matplotlib画图
首先画出随机生成数据的散点图
plt.scatter(x_data,y_data)
plt.xlabel("x")
plt.ylabel("y")
plt.title("Figure:Training Data")
画出我们的目标线性函数
plt.scatter(x_data,y_data)
plt.plot(x_data,1.0 + 2* x_data,'r',linewidth=3)
help(plt.plot)
构建模型
构建回归模型
def model(x,w,b):
return tf.multiply(x,w) + b
创建变量
- tensorflow变量声明函数是tf.Variable
- tf.Variable的作用是保存和更新参数
- 变量的初始值可以是随机数、常数、或是通过其他变量的初始值计算得到的
w = tf.Variable(np.random.randn(),tf.float32)
b = tf.Variable(0.0,tf.float32)
定义损失函数
- 损失函数用于描述预测值与真实值之间的误差,从而指导模型的收敛方向
- 常见损失函数:均方差
def loss(x,y,w,b):
err = model(x,w,b) - y
squared_err = tf.square(err)
return tf.reduce_mean(squared_err)
训练模型
设置训练超参数
training_epochs = 10
learning_rate = 0.01
关于学习率,就是步长,控制参数更新的幅度,设置过大会导致参数在极值附近来回摆动,不能保证收敛;设置过小,速度变慢,需要多次迭代
定义计算梯度
def grad(x,y,w,b):
with tf.GradientTape() as tape:
loss_ = loss(x,y,w,b)
return tape.gradient(loss_,[w,b])
在TensorFlow2中,使用tf.GradientTape()这一上下文管理器封装需要求导的计算步骤,并使用其gradient()方法求导
执行训练
模型训练阶段,设置迭代轮次,每次通过将样本逐个输入模型,进行梯度下降优化操作
step = 0
loss_list = []
display_step = 10
for epoch in range(training_epochs):
for xs,ys in zip(x_data,y_data):
loss_ = loss(xs,ys,w,b)
loss_list.append(loss_)
delta_w,delta_b = grad(xs,ys,w,b)
change_w = delta_w * learning_rate
change_b = delta_b * learning_rate
w.assign_sub(change_w)
b.assign_sub(change_b)
step=step+1
if step % display_step == 0:
print("Training Epoch:",'%02d' % (epoch+1),"Step:%03d" % (step),"loss=%.6f" %(loss_))
plt.plot(x_data,w.numpy() * x_data + b.numpy())
向下翻页会出现,从下图可以看出,本案例所拟合的模型较简单,训练5轮之后已经接近收敛对于复杂模型,需要更多次训练才能收敛
显示训练结果
print("w",w.numpy())
print("b",b.numpy())
就得到了w和b的值
* 数据每次运行都可能会有所不同
结果可视化
plt.scatter(x_data,y_data,label='Original data')
plt.plot(x_data,x_data * 2.0 + 1.0,label='Object line',color='g',linewidth=3)
plt.plot(x_data,x_data *w.numpy() + b.numpy(),label='Fitted line',color='r',linewidth=3)
plt.legend(loc=2)
进行预测
x_test=3.21
predict =model(x_test,w.numpy(),b.numpy())
print("预测值:%f"% predict)
target = 2* x_test +1.0
print("目标值:%f"% target)
查看损失变化情况
plt.plot(loss_list)