tensorflow实验-----假设有一组数据集,满足对应关系y=2x+1。要求训练一个模型,输入x,输出对应的y。 显示随机数据集线性图

实验题目

假设有一组数据集,满足对应关系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)

在这里插入图片描述
在这里插入图片描述

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值