Tensorflow实现单变量线性回归

了解如何使用Tensorflow对进行深度学习,假设我们要学习的函数为线性函数y=2x+1,使用的工具为Jupyter。以下是我的学习笔记。
导入需要的库

#在Jupyter中,使用matplotlib显示图像需要设置为inline模式,否则不会显示图像
%matplotlib inline

import matplotlib.pyplot as plt #载入matplotlib
import numpy as np #载入numpy
import tensorflow as tf #载入tensorflow

#设置随机数种子
np.random.seed(5)

生成数据
我们需要构造满足这个函数的x和y同时加入一些不满足方程的噪声

#直接采用np生成等差数列的方法,生成100个点,每个点的取值在-1~1之间
x_data = np.linspace(-1,1,100)
#y = 2x + 1 + 噪声 ,其中,噪声的维度与x_data一致
y_data = 2 * x_data + 1.0 + np.random.randn(*x_data.shape) * 0.4

这里,我们需要了解一些信息

#numpy.random.randn(d0,d1,...,dn)是从标准正态分布中返回一个或多个样本值
#标准正态分布又称为u分布,是以0为均值,以1为标准差的正态分布,记为N(0,1)
np.random.randn(10)

#x_data.shape值为一个元祖
x_data.shape

#实参的前面加上*和**时,就意味着拆包,单个*表示将元组拆成一个个单独的实参
np.random.randn(*x_data.shape)

#本例中,np.random.randn(*x_data.shape)和np.random.randn(100)功能相同
np.random.randn(100)

#y = 2x + 1 + 噪声,其中,的维度与x_data一致
y_data = 2*x_data + 1.0 + np.random.randn(100)*0.4

利用matplotlib画图

#画出随机生成数据的散点图
plt.scatter(x_data,y_data)
#画出我们想要通过学习得到的目标线性函数 y = 2x+1
plt.plot(x_data,1.0 + 2 * x_data,color='red',linewidth=3)

[<matplotlib.lines.Line2D at 0x128879672b0>]
构建模型

#定义训练数据占位符,x是特征值,y是标签值

x = tf.placeholder("float",name = "x")
y = tf.placeholder("float",name = "y")

构建回归模型

def model(x, w, b):
    return tf.multiply(x, w) + b

创建变量

·Tensorflow变量的声明函数是tf.Variable

·tf.Variable的作用是保存和更新参数

·变量的初始值可以是随机数、常数,或是通过其他变量的初始值计算得到

#构建线性函数的斜率,变量w
w = tf.Variable(1.0,name="w0")

#构建线性函数的截距,变量b
b = tf.Variable(0.0,name="b0")
#pred是预测值,前向计算
pred = model(x, w, b)

训练模型

#迭代次数(训练轮数)
train_epochs = 10

#学习率
learning_rate = 0.05

#控制显示loss值的粒度
display_step = 10

定义损失函数
·损失函数用于描述预测值与真实值之间的误差,从而指导模型收敛的方向

·常见损失函数:均方差(Mean Square Error,MSE)和交叉熵(cross-entropy)

#采用均方差作为损失函数
loss_function = tf.reduce_mean(tf.square(y-pred))

选择优化器

#梯度下降优化器
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss_function)

声明会话

sess = tf.Session()

变量初始化
·在真正执行计算之前,需将所有变量初始化

·通过tf.global_variable_initializer函数可实现对所有变量的初始化

init = tf.global_variables_initializer()
sess.run(init)

执行训练

for xs,ys in zip(x_data,y_data):
    print(xs, ys)

开始训练

#开始训练,轮数为epoch,采用SGD随机梯度下降优化方法
step = 0 #记录训练步数
loss_list = [] #用于保存loss值的列表

for epoch in range(train_epochs):
    for xs,ys in zip(x_data,y_data):
        _, loss = sess.run([optimizer,loss_function],feed_dict={x:xs,y:ys})
        #显示损失值loss
        #display_step:控制报告的粒度
        #例如,如果display_step设置为2,则将每训练2个样本输出一次损失值
        #与超参数不同,修改display_step不会更改模型所学习的规律
        loss_list.append(loss)
        step=step+1
        if step % display_step == 0:
            print("Train Epoch:", '%02d' % (epoch+1), \
                  "Step : %03d" % (step), \
                 "{:.9f}", format(loss))
        
    b0temp = b.eval(session=sess)
    w0temp = w.eval(session=sess)
    plt.plot(x_data,w0temp * x_data + b0temp) #画图

在这里插入图片描述
从上图可以看出,由于本案例所拟合的模型简单,训练3次之后已经接近收敛,对于复杂模型,需要更多次训练才能收敛

plt.plot(loss_list)

在这里插入图片描述

plt.plot(loss_list,'r*')

在这里插入图片描述

[x for x in loss_list if x>1] #筛选出你想要的结果范围

打印结果

print("w:",sess.run(w)) #w的值应该在2附近
print("b:",sess.run(b)) #b的值应该再1附近

可视化

plt.scatter(x_data,y_data,label='Original data')
plt.plot(x_data,x_data * sess.run(w) + sess.run(b),\
        label = 'Fitted line',color='r',linewidth=3)
plt.legend(loc=2) #通过参数loc指定图例位置

在这里插入图片描述
利用模型 进行预测

x_test = 3.2 #随机假设的x值

predict = sess.run(pred, feed_dict={x: x_test}) #前向计算
print("预测值:%f" % predict)

target = 2 * x_test + 1.0
print("目标值:%f" % target)
x_test = 3.2 #随机假设的x值
predict = sess.run(w) * x_test + sess.run(b)
print("预测值:%f" % predict)

以上是利用Tensorflow训练一个线性模型并进行预测的完整过程。

通过逐渐降低损失值loss来训练参数w和b拟合y = 2x + 1中的系数2和1

小结
(1)生成人工数据集及其可视化

(2)构建线性模型

(3)定义损失函数

(4)定义优化器、最小损失函数

(5)训练结果的可视化

(6)利用学习到的模型进行预测

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值