服务器之家

服务器之家 > 正文

用tensorflow构建线性回归模型的示例代码

时间:2021-01-19 09:15     来源/作者:freedom098

tensorflow构建简单的线性回归模型是tensorflow的一个基础样例,但是原有的样例存在一些问题,我在实际调试的过程中做了一点自己的改进,并且有一些体会。

首先总结一下tf构建模型的总体套路

1、先定义模型的整体图结构,未知的部分,比如输入就用placeholder来代替。

2、再定义最后与目标的误差函数。

3、最后选择优化方法。

另外几个值得注意的地方是:

1、tensorflow构建模型第一步是先用代码搭建图模型,此时图模型是静止的,是不产生任何运算结果的,必须使用Session来驱动。

2、第二步根据问题的不同要求构建不同的误差函数,这个函数就是要求优化的函数。

3、调用合适的优化器优化误差函数,注意,此时反向传播调整参数的过程隐藏在了图模型当中,并没有显式显现出来。

4、tensorflow的中文意思是张量流动,也就是说有两个意思,一个是参与运算的不仅仅是标量或是矩阵,甚至可以是具有很高维度的张量,第二个意思是这些数据在图模型中流动,不停地更新。

5、session的run函数中,按照传入的操作向上查找,凡是操作中涉及的无论是变量、常量都要参与运算,占位符则要在run过程中以字典形式传入。

以上时tensorflow的一点认识,下面是关于梯度下降的一点新认识。

1、梯度下降法分为批量梯度下降和随机梯度下降法,第一种是所有数据都参与运算后,计算误差函数,根据此误差函数来更新模型参数,实际调试发现,如果定义误差函数为平方误差函数,这个值很快就会飞掉,原因是,批量平方误差都加起来可能会很大,如果此时学习率比较高,那么调整就会过,造成模型参数向一个方向大幅调整,造成最终结果发散。所以这个时候要降低学习率,让参数变化不要太快。

2、随机梯度下降法,每次用一个数据计算误差函数,然后更新模型参数,这个方法有可能会造成结果出现震荡,而且麻烦的是由于要一个个取出数据参与运算,而不是像批量计算那样采用了广播或者向量化乘法的机制,收敛会慢一些。但是速度要比使用批量梯度下降要快,原因是不需要每次计算全部数据的梯度了。比较折中的办法是mini-batch,也就是每次选用一小部分数据做梯度下降,目前这也是最为常用的方法了。

3、epoch概念:所有样本集过完一轮,就是一个epoch,很明显,如果是严格的随机梯度下降法,一个epoch内更新了样本个数这么多次参数,而批量法只更新了一次。

以上是我个人的一点认识,希望大家看到有不对的地方及时批评指针,不胜感激!

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#encoding=utf-8
__author__ = 'freedom'
import tensorflow as tf
import numpy as np
 
def createData(dataNum,w,b,sigma):
 train_x = np.arange(dataNum)
 train_y = w*train_x+b+np.random.randn()*sigma
 #print train_x
 #print train_y
 return train_x,train_y
 
def linerRegression(train_x,train_y,epoch=100000,rate = 0.000001):
 train_x = np.array(train_x)
 train_y = np.array(train_y)
 n = train_x.shape[0]
 x = tf.placeholder("float")
 y = tf.placeholder("float")
 w = tf.Variable(tf.random_normal([1])) # 生成随机权重
 b = tf.Variable(tf.random_normal([1]))
 
 pred = tf.add(tf.mul(x,w),b)
 loss = tf.reduce_sum(tf.pow(pred-y,2))
 optimizer = tf.train.GradientDescentOptimizer(rate).minimize(loss)
 init = tf.initialize_all_variables()
 
 sess = tf.Session()
 sess.run(init)
 print 'w start is ',sess.run(w)
 print 'b start is ',sess.run(b)
 for index in range(epoch):
  #for tx,ty in zip(train_x,train_y):
   #sess.run(optimizer,{x:tx,y:ty})
  sess.run(optimizer,{x:train_x,y:train_y})
  # print 'w is ',sess.run(w)
  # print 'b is ',sess.run(b)
  # print 'pred is ',sess.run(pred,{x:train_x})
  # print 'loss is ',sess.run(loss,{x:train_x,y:train_y})
  #print '------------------'
 print 'loss is ',sess.run(loss,{x:train_x,y:train_y})
 w = sess.run(w)
 b = sess.run(b)
 return w,b
 
def predictionTest(test_x,test_y,w,b):
 W = tf.placeholder(tf.float32)
 B = tf.placeholder(tf.float32)
 X = tf.placeholder(tf.float32)
 Y = tf.placeholder(tf.float32)
 n = test_x.shape[0]
 pred = tf.add(tf.mul(X,W),B)
 loss = tf.reduce_mean(tf.pow(pred-Y,2))
 sess = tf.Session()
 loss = sess.run(loss,{X:test_x,Y:test_y,W:w,B:b})
 return loss
 
if __name__ == "__main__":
 train_x,train_y = createData(50,2.0,7.0,1.0)
 test_x,test_y = createData(20,2.0,7.0,1.0)
 w,b = linerRegression(train_x,train_y)
 print 'weights',w
 print 'bias',b
 loss = predictionTest(test_x,test_y,w,b)
 print loss

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

相关文章

热门资讯

2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全 2019-12-26
Intellij idea2020永久破解,亲测可用!!!
Intellij idea2020永久破解,亲测可用!!! 2020-07-29
背刺什么意思 网络词语背刺是什么梗
背刺什么意思 网络词语背刺是什么梗 2020-05-22
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总 2020-11-13
歪歪漫画vip账号共享2020_yy漫画免费账号密码共享
歪歪漫画vip账号共享2020_yy漫画免费账号密码共享 2020-04-07
返回顶部