持续创作,加速成长!这是我参与「掘金日新计划 · 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轮的训练,权重与偏置非常接近真实值,训练效果不错。