【利用Tensorflow 實現和訓練線性迴歸 (Linear Model)】(超級詳細,附源代碼)

附上github的源代碼地址:https://github.com/w1449550206/Linear-regression-with-tensorflow.git

1.線性迴歸的介紹

根據訓練數據,訓練一個w1x1+w2x2+…+b = y,有多少個特徵,就有多少個權重

2.訓練數據的獲取

假設隨機的一百個點,且只有一個特徵,y = wx+b
特徵值:訓練數據100個樣本,100行1列[100, 1]
目標值:y = 0.8*x+0.7 (造數據用的,一開始是不知道的)

3.步驟分析

  • 1.準備好數據集,我們製造y=0.8x+0.7的100個樣本
  • 2.建立線性模型,隨機初始化w1和b1,y=wx+b,目標求出權重w和偏置b (比如我們隨機一個w爲0.2,b爲0.7,和我們假設已經知道的0.8和0.7差很遠,所以接下來要確定損失函數,然後梯度下降優化來找到損失最小的w和b)
  • 3.確定損失函數(預測值與真實值之間的誤差),即均方誤差
  • 4.梯度下降優化損失:需要制定學習率(超參數)

4.相關的API

運算

矩陣運算

tf.matmul(x,w)

平方

tf.square(error)

均值

tf.reduce_mean(error)

誤差

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

梯度下降優化

tf.train.GradientDescentOptimizer(learning_rate)
  • learing_rate是學習率,一般爲0-1之間比較小的值
  • method: minimize(loss)損失優化
  • return: 梯度下降op
    返回一個節點操作:
optimizer = tf.train.GradientDescentOptimizer(learning_rate = 0.01).minimize(error)

5.完整代碼

1.準備好數據集,我們製造y=0.8x+0.7的100個樣本

# 特徵值x,目標值y_true
x = tf.random_normal(shape=(100, 1), mean=2, stddev=2)
y_true = tf.matmul(x,[[0.8]])+0.7

2.建立線性模型,目標:求出權重W和偏置b

y = W·X + b

3.隨機初始化w1和b1

w_ran =tf.Variable(initial_value=tf.random_normal(shape = (1,1)))
b_ran = tf.Variable(initial_value=tf.random_normal(shape=(1,1)))
y_predict = tf.matmul(x,w_ran)+b_ran

4.確定損失函數(預測值與真實值之間的誤差)即均方誤差

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

5.梯度下降優化損失:需要制定學習率(超參數)

optimizer = tf.train.GradientDescentOptimizer(learning_rate = 0.01).minimize(error)

6.初始化變量

init = tf.global_variables_initializer()

7.開啓會話進行訓練

with tf.Session() as sess:
    #運行初始化變量op
    sess.run(init)
    print("隨機初始化的權重爲%f, 偏置爲%f" % (w_ran.eval(), b_ran.eval()))
    # 訓練模型
    for i in range(100):
        sess.run(optimizer)
        print("第%d步的誤差爲%f,權重爲%f, 偏置爲%f" % (i, error.eval(), w_ran.eval(), b_ran.eval()))

8.完整代碼

import tensorflow as tf

def linear_regression():
    '''
    # - 1.準備好數據集,我們製造y=0.8x+0.7的100個樣本
    # - 2.建立線性模型,隨機初始化w1和b1,y=wx+b,目標求出權重w和偏置b ==(比如我們隨機一個w爲0.2,b爲0.7,和我們假設已經知道的0.8和0.7差很遠,所以接下來要確定損失函數,然後梯度下降優化來找到損失最小的w和b)==
    # - 3.確定損失函數(預測值與真實值之間的誤差),即均方誤差
    # - 4.梯度下降優化損失:需要制定學習率(超參數)
    :return:
    '''

    # - 1.準備好數據集,我們製造y=0.8x+0.7的100個樣本
    # 特徵值x,目標值y_true
    x = tf.random_normal(shape=(100, 1), mean=2, stddev=2)
    y_true = tf.matmul(x, [[0.8]]) + 0.7

    ## 2.建立線性模型,目標:求出權重W和偏置b
    # y = W·X + b

    ## 3.隨機初始化w1和b1
    w_ran = tf.Variable(initial_value=tf.random_normal(shape=(1, 1)))
    b_ran = tf.Variable(initial_value=tf.random_normal(shape=(1, 1)))
    y_predict = tf.matmul(x, w_ran) + b_ran

    ## 4.確定損失函數(預測值與真實值之間的誤差)即均方誤差
    error = tf.reduce_mean(tf.square(y_predict - y_true))

    ## 5.梯度下降優化損失:需要制定學習率(超參數)
    optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01).minimize(error)

    # 初始化變量
    init = tf.global_variables_initializer()

    # 至此整張圖就好了

    # 開啓會話進行訓練

    with tf.Session() as sess:
        # 運行初始化變量op
        sess.run(init)
        print("隨機初始化的權重爲%f, 偏置爲%f" % (w_ran.eval(), b_ran.eval()))
        # 訓練模型
        for i in range(2000):
            sess.run(optimizer)
            print("第%d步的誤差爲%f,權重爲%f, 偏置爲%f" % (i, error.eval(), w_ran.eval(), b_ran.eval()))
if __name__ == '__main__':
    linear_regression()

在這裏插入圖片描述

6變量的trainable設置觀察

trainable的參數作用,指定是否訓練

weight = tf.Variable(tf.random_normal([1, 1], mean=0.0, stddev=1.0), name="weights", trainable=False)

還有一些更加複雜的功能進行優化可以進入另一篇博文中查看:https://blog.csdn.net/qq_35456045/article/details/104687223

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章