【深度学习】TensorFlow线性回归案例演示(2)

205 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第19天,点击查看活动详情

注意:本文使用tensorflow1.x版本进行演示

使用本地Jupyter Notebook搭载TensorFlow相关库进行操作

首先我们简单回归一下案例的要求。

1. 线性回归案例需求

案例需求:

  • 本案例我们将使用TensorFlow的基础API与高级APi实现线性回归。
  • 案例提供真实数据(真实目标值与特征值),并且他们符合y+0.5x+1的线性关系
  • 案例有100个样本
  • x真实值形状:100行1列,因为有100个真实样本数据样本,每个样本有1个特征,即(100,1)
  • y真实值形状:100行1列,因为有100个真实目标值数据样本,每个样本的目标值只有一个,即(100,1)
  • 我们试图用线性回归进行拟合,得到最终线性回归方程。

2. 案例代码演示

2.0 导入依赖库

导入所需要的库

  • 因为我们想使用tensorflow1.x版本进行演示,而我们下载的tensorflow版本为2.x版本
  • 因此,需要使用如下导入库的方式,开启tensorflow1兼容模式
  • 这样就能使用tensorflow1的语法了
import tensorflow as tf
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()

将线性回归定义在函数中

2.1 准备数据

  • 本案例没有使用现有数据集,因此我们需要自己生成数据来案例演示
  • 在准备数据的地方,我们使用tf.random_normal生成了100个一维样本数据
  • 同时,根据所生成的样本数据使用matmul矩阵乘法能够生成100个目标值数据

2.2 模型构造

  • 在模型构造的时候,主要需要我们使用tf.Variable来定义变量
  • 变量中的初始值可以给一个正态分布随机初始值,后续训练的时候也会不断迭代,因此我们使用变量来定义
  • 我们主要需要用tensorflow的API来定义三个变量,分别是weights,bias和y_predict。
  • 后者y_predict是根据weights,bias以及X计算而来

2.3 损失函数&优化损失

  • 首先需要我们定义MSE均方误差损失函数error
  • 然后,定义梯度下降优化器来优化损失error
  • 这样数据就流动起来了

2.4 开启会话

  • 在开始会话之前不要忘记初始化变量
  • 开启会话打印模型的初始参数
  • 然后,在会话中开启100轮训练,每轮训练后都打印每轮训练后的参数(需要用到循环)
def linear_regression():
    """
    实现线性回归
    """
    # 1.1 准备数据
    X = tf.random_normal(shape=[100,1])
    y_true = tf.matmul(X, [[0.5]]) + 1 # matmul矩阵运算
    
    # 1.2 模型构造
    # 定义模型参数
    # 用变量来定义
    weights = tf.Variable(initial_value=tf.random_normal(shape=[1,1])) # 需要给一个初始设置:正态分布随机初始值;一行一列
    bias = tf.Variable(initial_value=tf.random_normal(shape=[1,1]))
    y_predict = tf.matmul(X, weights) + bias
    
    # 1.3 损失函数
    error = tf.reduce_mean(tf.square(y_predict-y_true))
    
    # 1.4 优化损失
    optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01).minimize(error)
    
    # 2. 初始化变量
    init = tf.global_variables_initializer()
    
    # 3. 开启会话
    with tf.Session() as sess:
        sess.run(init)
        
        # 查看初始化模型参数的值
        print("训练前模型参数为:权重%f, 偏置%f, 损失%f" %(weights.eval(), bias.eval(), error.eval()))
        
        # 4. 开始训练
        for i in range(1000):
            sess.run(optimizer)
            print("第%d次训练后模型参数为:权重%f, 偏置%f, 损失%f" %(i+1, weights.eval(), bias.eval(),error.eval()))
        
    return None

linear_regression()

代码运行结果如下图所示:经过1000轮的训练,权重与偏置非常接近真实值,训练效果不错。

image.png

image.png