1. 程式人生 > >Tensorflow學習筆記:實現簡單的線性迴歸

Tensorflow學習筆記:實現簡單的線性迴歸

#線性迴歸是什麼
    y = w1x1 + w2x2 + w3x3 + w4x4 + ... + w_nx_n + bias
    演算法:線性迴歸
    策略:均方誤差
    優化:梯度下降演算法(需要設定學習率)

#訓練過程
1、準備好特徵和目標值,例子用廣告投入與銷量之間的關係    
    這裡準備特徵值100個[100,1]
    用y = x*0.7 + 0.8a計算出目標值[100,1]
2、建立模型(畫圖)
    注:給n個特徵,那麼需要設定n個權重,一個偏置
    這裡準備一個權重w,一個偏執b(隨機初始化)    
    
3、求預測結果、計算損失
    y_predict = x*w + b
    損失函式loss = ((y1-y1')^2 + ... + (y100-y100')^2)/100

4、梯度下降減小損失,優化引數,指定學習率        

#實現線性迴歸需要的API
    矩陣相乘tf.matmul(x,w)
    平方tf.square()
    均值tf.reduce_mean()
    梯度下降tf.train.GradientDescentOptimizer(learning_rate,method = minmum(loss),返回op

#模型引數必須用Varialbe定義


#梯度爆炸問題
    1、重新設計網路
    2、調整學習率
    3、使用梯度截斷
    4、使用啟用函式

#線性迴歸問題程式碼:
def myregression():
    """
    實現線性迴歸預測
    return: None
    """
    #1、準備好特徵和目標值
    x = tf.random_normal([100,1],mean = 10,stddev = 2,name = 'input_data_x')
    y_true = tf.matmul(x,[[0.7]]) + 0.8

    #2、建立迴歸模型,1個特徵,1個權重
    w = tf.Variable(tf.random_normal([1,1],mean = 0.0,stddev = 1.0),name = 'weight')
    b = tf.Variable(0.0,name='bias')
    y_predict = tf.matmul(x,w) + b


    
    loss = tf.reduce_mean(tf.square(y_true-y_predict))

    #4、梯度下降演算法優化損失
    train_op = tf.train.GradientDescentOptimizer(0.006).minimize(loss)

    #定義變數初始化op    
    init_op = tf.global_variables_initializer()

    tf.summary.histogram("input_x",x)
    merge_op = tf.summary.merge_all()
    
    #通過會話執行訓練過程
    with tf.Session() as sess:
        #初始化變數
        sess.run(init_op)

        for i in range(30000):
            sess.run(train_op)
            print("after %d times of training w&b is %f %f"%(i,w.eval(),b.eval()))

import tensorflow as tf
if __name__ == "__main__":
    myregression()

#經驗:
    如果發生了梯度爆炸,即引數結果出現了nan,則是學習率太大,這時需要調整學習率;同時,資料的質量對結果的影響也很大