线性回归Tensorflow实现
简介:本文会讲解一段使用Tensorflow实现线性回归的代码,这些代码中涉及到的一些知识点,会有细致入微的讲解。
本专栏将会在Tensorflow1.14.0版本下,讲解神经网络,希望大家可以多多关注支持。
线性回归Tensorflow实现
- 1 生成随机样本
- 1.1 np.linspace函数
- 1.2[:, np.newaxis] 的用法
- 2 定义两个placeholder占位
- 3 中间层
- 3.1 权重
- 3.2 偏置值
- 3.3 线性变换
- 3.4激活函数
- 4输出层
- 4.1权重
- 4.2 偏置值
- 4.3 线性变换
- 4.4激活函数
- 4.5损失函数
- 4.6梯度下降
- 4.6.1 tf.train.GradientDescentOptimizer
- 4.6.1.1参数learning_rate
- 4.6.1.2参数use_locking
- 4.6.2minimize 方法参数及作用
- 4.6.2.1参数loss
- 4.6.2.2参数global_step
- 4.6.2.3参数var_list
- 5 Session预测
- 5.1初始化Variable
- 5.2 迭代梯度下降,获得预测结果
- 5.3画图展示结果
- 6总的代码
- 致谢
1 生成随机样本
1.1 np.linspace函数
他的作用是创建一个等差数列
基础的参数是start stop num,等差数列从哪里开始,截止到哪里,有多少个数。
其他的参数包括 endpoint :他的作用是决定是否包括截止的stop
retstep 的作用是返回数列的间隔,默认为False。dtype是等差数列的数据类型
下面这段代码展示了他所有参数的作用
import numpy as np
np_array,np_step = np.linspace(start = 3, stop = 20 , num =8 ,endpoint = False,retstep = True,dtype = np.float32)
print(f"等差数列 不包含终止值{np_array}")
print(f"这是等差数列的间隔{np_step}")
1.2[:, np.newaxis] 的用法
-
np.newaxis 是一个特殊的索引操作,它用于增加数组的维度。在你的代码中,[:, np.newaxis] 可以分为两部分来理解。
-
表示选择所有的行。因为前面 np.linspace 生成的是一个一维数组,这里可以理解为只有一行。
np.newaxis 将这一行的数据转换为列向量,即将原来形状为 (200,) 的一维数组转换为形状为 (200, 1) 的二维数组。
所以我们下面要生成一个随机样本是200,1的代码如下
# 生成随机点200个
x_data = np.linspace(-0.5,0.5,200)[:,np.newaxis]
noise = np.random.normal(0,0.02,x_data.shape)
y_data = np.square(x_data)+noise
x_data是一个(200,1)的数组
noise是生成的噪声
y_data = x的平方+noise
2 定义两个placeholder占位
如果您不理解placeholder可以阅读我的文章:Tensorflow基本概念
x = tf.compat.v1.placeholder(tf.float32,[None,1])
y = tf.compat.v1.placeholder(tf.float32,[None,1])
3 中间层
3.1 权重
因为我们是要根据点的x坐标预测他的y坐标,所以输入层的维度为(1),假设我们在中间层设计10个神经元,所以初始化权重的shape为(1,10)
Weights_L1 = tf.compat.v1.Variable(tf.random.normal((1,10)))
3.2 偏置值
偏置值与权重具有相同的shape
biase_L1 = tf.compat.v1.Variable(tf.zeros((1,10)))
3.3 线性变换
把输入层与权重矩阵相乘再和偏置值求和
plus_L1 = tf.matmul(x,Weights_L1) + biase_L1
3.4激活函数
非线性变换,让神经网络可以拟合更加复杂的线性关系
L1 = tf.nn.tanh(plus_L1)
4输出层
4.1权重
因为中间层是10个神经元,预测结果是y的值,所以shape是(10,1)
Weights_L2 = tf.Variable(tf.random_normal((10,1)))
4.2 偏置值
因为输出结果是y的预测所以偏置值的shape是(1,1)
biase_L2 = tf.Variable(tf.zeros((1,1)))
4.3 线性变换
中间层的输出作为输入*输出层的权重矩阵+偏置值
plus_L2 = tf.matmul(L1,Weights_L2)+biase_L2
4.4激活函数
prediction = tf.nn.tanh(plus_L2)
4.5损失函数
使用预测值和真实值的差的平方作为损失函数,可以减少正负的影响,并且对增加误差大的损失函数值
loss = tf.reduce_mean(tf.square(y-prediction))
4.6梯度下降
4.6.1 tf.train.GradientDescentOptimizer
作用是根据计算得到的损失函数(在你的代码中就是 loss 变量所代表的损失函数)关于模型参数(比如神经网络中的权重和偏置等可训练变量)的梯度,来更新这些模型参数,以使得损失函数的值逐渐减小,进而提升模型的性能。
4.6.1.1参数learning_rate
学习率设置得过大,可能会导致在优化过程中直接跳过了损失函数的最小值点,使得损失函数无法收敛甚至发散;而如果学习率设置得过小,参数更新的速度会非常慢,导致训练时间过长,模型收敛速度迟缓。合适的学习率通常需要通过一些实验和调优来确定,常见的取值范围可能在 0.001 到 0.1 等之间,具体取决于不同的数据集、网络结构等因素。
4.6.1.2参数use_locking
默认为False,他的作用是在多线程的环境下避免数据被改变,一般不是太复杂的不用,可以避免额外的锁开销,提高运行效率。
4.6.2minimize 方法参数及作用
4.6.2.1参数loss
一个 Tensor(张量)对象,代表需要最小化的损失函数。在你的代码中,就是前面定义的计算预测值和真实值之间均方误差的 loss 变量。这个损失函数包含了对模型所有可训练变量(例如神经网络的权重和偏置等)的依赖关系,这样在调用 minimize 方法时,TensorFlow 内部会通过自动求导机制计算出损失函数关于这些可训练变量的梯度,进而根据梯度和学习率等信息来更新这些变量
4.6.2.2参数global_step
含义:这个参数可以用于记录训练过程中的步数,比如训练进行到了第几轮或者第几步等信息。在一些复杂的训练场景中,例如学习率衰减(随着训练步数的增加逐渐减小学习率)等策略的实现中会用到它,通过将当前的训练步数传递进去,根据步数来动态调整学习率等超参数。如果不需要使用这个功能,在简单的代码中可以不传递该参数,就像你代码中那样直接省略它。
4.6.2.3参数var_list
一个可迭代的 Tensor(张量)对象列表或者元组等,里面包含了需要更新的变量。默认情况下,如果不传递这个参数,TensorFlow 会自动收集所有在计算 loss 张量时涉及到的可训练变量(也就是那些使用 tf.Variable 创建的变量),并对它们进行更新。但有时候你可能只想更新部分变量,例如在一些复杂的模型结构中,有多个部分的变量但只想更新其中某一个子模块的变量,这时就可以通过显式地指定 var_list 参数来明确需要更新的变量范围。
在本案例中的梯度下降代码如下
train_step = tf.train.GradientDescentOptimizer(0.1).minimize(loss)
5 Session预测
5.1初始化Variable
init_option = tf.compat.v1.global_variables_initializer()
with tf.compat.v1.Session() as calculate:
calculate.run(init_option)
5.2 迭代梯度下降,获得预测结果
如果您不会feet_dict传参,可以阅读我的文章:Tensorflow基本概念
for i in range(2000):
calculate.run(train_step,feed_dict = {x:x_data,y:y_data})
# 获得预测值
prediction_value = calculate.run(prediction,feed_dict = {x:x_data})
5.3画图展示结果
plt.figure()
plt.scatter(x_data,y_data)
plt.plot(x_data,prediction_value,'r-',lw=5)
plt.show()
6总的代码
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
# 生成随机点200个
x_data = np.linspace(-0.5,0.5,200)[:,np.newaxis]
noise = np.random.normal(0,0.02,x_data.shape)
y_data = np.square(x_data)+noise
# 定义两个placeholder
x = tf.compat.v1.placeholder(tf.float32,[None,1])
y = tf.compat.v1.placeholder(tf.float32,[None,1])
# 定义神经网络的中间层
# 权重:输入层一个神经元,中间层10个神经元所以是 1,10
Weights_L1 = tf.compat.v1.Variable(tf.random.normal((1,10)))
# 偏置值
biase_L1 = tf.compat.v1.Variable(tf.zeros((1,10)))
# tf.matmul乘法
# 得到总和
plus_L1 = tf.matmul(x,Weights_L1) + biase_L1
# 激活函数
L1 = tf.nn.tanh(plus_L1)
#定义神经网络输出层
Weights_L2 = tf.Variable(tf.random_normal((10,1)))
biase_L2 = tf.Variable(tf.zeros((1,1)))
plus_L2 = tf.matmul(L1,Weights_L2)+biase_L2
prediction = tf.nn.tanh(plus_L2)
# 二次代价函数
loss = tf.reduce_mean(tf.square(y-prediction))
# 使用梯度下降法
train_step = tf.train.GradientDescentOptimizer(0.1).minimize(loss)
# 使用variable需要先初始化
init_option = tf.compat.v1.global_variables_initializer()
with tf.compat.v1.Session() as calculate:
calculate.run(init_option)
for i in range(2000):
calculate.run(train_step,feed_dict = {x:x_data,y:y_data})
# 获得预测值
prediction_value = calculate.run(prediction,feed_dict = {x:x_data})
plt.figure()
plt.scatter(x_data,y_data)
plt.plot(x_data,prediction_value,'r-',lw=5)
plt.show()
致谢
本文参考了一些博主的文章,博取了他们的长处,也结合了我的一些经验,对他们表达诚挚的感谢,使我对 Tensorflow在线性回归的使用有更深入的了解,也推荐大家去阅读一下他们的文章。纸上学来终觉浅,明知此事要躬行:
np.linspace函数用法