用tensorflow構建線性迴歸模型的範例程式碼,tensorflow範例程式碼

來源:互聯網
上載者:User

用tensorflow構建線性迴歸模型的範例程式碼,tensorflow範例程式碼

用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內更新了樣本個數這麼多次參數,而批量法只更新了一次。

以上是我個人的一點認識,希望大家看到有不對的地方及時批評指標,不勝感激!

#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 

以上就是本文的全部內容,希望對大家的學習有所協助,也希望大家多多支援幫客之家。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.