tensorflow线性回归案例

TensorFlow线性回归案例

通过一个案例来讲述如何使用tensorflow来做线性回归

什么是线性回归

线性回归的公式:

1个特征:y=w*x+b,x是输入,y是输出,w是权重,b是偏置

n个特征:y=w1*x1+w2*x2......+wn*xn+b,有n个权重,1个偏置

 

线性回归的核心:

  •  算法:线性回归
  • 策略:均方误差
  • 优化:梯度下降,需要置学习率

线性回归的使用步骤

 1. 准备好特征值和目标值,也就是数据,特征值是输入,目标值是输出,以预测房价为例,

位置,面积,朝向等都是特征值,房总价是目标值。

2.建立模型,需要一个权重,一个偏置,然后在随机初始化,得到一个预测函数y_predict.

3.求损失函数,也就是误差,这里用的是均方误差。

4.优化损失,在线性回归中,我们通过梯度下降的方式来优化损失,求损失函数最小值,

形象化得说法就是,给定一个随机点,从山上找到山底的一个过程,如下图所示。

说明:什么是均方误差?

就是对预测值和目标值求差并开根号,然后求平均值,公式如下:

[(y1-y1')^2+....+(yn-yn')^2]/n

核心api

梯度下降优化api:tf.train.GradientDescentOptimizer(learning_rate)

参数说明:

learning_rate:学习率,一般为0.1、0.01、0.001等量级的,当然也可以是1,10,100,但是基本不会这么写。

函数返回的是一个梯度下降op,我们可以在会话中进行。

核心代码

 1 import tensorflow as tf
 2 import os
 3 
 4 
 5 def mymigration():
 6     """
 7     自实现一个线性回归预测
 8     :return: 
 9     """
10     #1. 准备数据,这里我们通过一个公式来模拟数据,如果是真是数据,我们可以读取外部数据
11     x = tf.random_normal([100,1],mean=0.0,stddev=1.0)
12     #矩阵相乘必须是二维的
13     y_true = tf.matmul(x,[[0.7]]) + 0.8
14 
15 
16     #2.建立一个线性回归模型,1个权重,1个偏置,y=w*x+b
17     #随机给一个权重和偏置,让他去计算损失,也就是相当于梯度下降的起点
18     #在这里,我们的weight和bias是需要去优化的,他是变化的,必须使用tf.Variable去定义
19     #在定义的过程中,我们可以通过设置台trainable=False来限制某个变量不随梯度下降进行进行优化,默认是True
20     weight = tf.Variable(tf.random_normal([1,1], mean=0.0,stddev=1.0 , name='w'))
21     bias = tf.Variable(0.0,name='b')
22     y_prerdict = tf.matmul(x,weight)+bias
23 
24 
25     #建立损失函数,均方误差,tf.square求误差,reduce_mean求平均值
26     loss = tf.reduce_mean(tf.square(y_true-y_prerdict))
27 
28 
29     #梯度下降优化损失,学习率是0.1。
30     train_op = tf.train.GradientDescentOptimizer(0.1).minimize(loss)
31 
32 
33     #定义一个初始化变量的op
34     init_op = tf.global_variables_initializer()
35     #通过会话来运行程序
36     with tf.Session() as  sess:
37         #初始化变量
38         sess.run(init_op)
39         #运行优化200次,也就是run op 200次
40         for i in range(200):
41             sess.run(train_op)
42             print('第%d次优化的权重和偏置:权重为:%f,偏置为:%f'%(i,weight.eval(),bias.eval()))
43     return None
44 if __name__ == "__main__":
45     mymigration( )

 

运行结果如下所示:

因为没有数据,我通过公式y_true  =  tf.matmul ( x, [ [ 0.7 ] ] ) + 0.8 来随机样本数据

实际中,我们可以通过读取外部是数据,训练并构建模型

通过200词次的训练,我们最后打得到的权重为0.7,0.8,训练的模型比较贴合数据,可以直接和模拟数据的

公式比较,如果我们是导入外部数据的话,是不知道训练的模型好坏的,我们需要不断的优化提高模型的准

确率。

学习率

learn__rate在梯度下降中是一个十分重要的参数,他决定从山顶到达山底的step和速度,一般都很小,0.1,

0.01,0.001等等都有。

learn_rate过大过小都不好,过大的话可能会导致梯度爆炸,过小会达不到想要的训练效果,需要增加训练次数

补充说明:
 
梯度爆炸:在极端的情况下,权重的值变得非常大,以至于溢出,导致NAN值但就是梯度爆炸,梯度爆炸的问题在学习

深度神经网络RNN中更容易出现。

如何解决梯度爆炸:(1):重新设计网络,(2)调整学习率, (3)使用梯度截断,在训练的过程中检查和限制梯度的

大小;(4)使用激活函数

猜你喜欢

转载自www.cnblogs.com/Maxim/p/12645757.html
今日推荐