1. 程式人生 > >TensorFlow 學習(四) 線性迴歸模型

TensorFlow 學習(四) 線性迴歸模型

線性迴歸演算法的主要優點是它的簡單性,線性迴歸的損失函式是平方損失。一般處理連續性問題,比如預測房價等,在本文中,使用 TensorFlow 訓練一個簡單線性迴歸模型。

線性迴歸模型 y = wx + b:

  • 準備好特徵和目標值資料集

    import tensorflow as tf
    import numpy as np
    import matplotlib.pyplot as plt
    import os
    
    # 這裡自定義100個數據集
    n = 100
    data_x = np.arange(n)
    data_y = 2.0 * data_x + np.random.RandomState(0).randint(-20, 20, size=(n,))
    data = np.stack([data_x, data_y], axis=1)

     實際上,一般都是收集好資料集配置成表文件,然後處理,但是我這裡就隨機準備好100個數據集data_x, data_y 特徵  

    • np.random.RandomState(0): 偽隨機數生成器

    • randint(-20,20,size=(n,): 生成 -20 到 20 之間,n 個數。

  • 建立變數 w 和 b

    # 建立變數w 和 b
    w = tf.Variable(0.0, name="weights")
    b = tf.Variable(0.0, name="bias")

    這裡的w 、b 先建立張量變數為浮點數 0.0 ,但是並沒有初始化,後面的執行中,才初始化

  • X 和 Y 佔位符

    def inputs():
        X = tf.placeholder(tf.float32, name="X")
        Y = tf.placeholder(tf.float32, name="Y")
        return X,Y

    注意:在這裡X、Y並沒有賦值, tf.placeholder :  為張量插入佔位符,這個張量總是被賦值的

  • 推論,建立預測

    def inference(X):
        return X * w + b

     線性: y =  wx + b

  • 計算損失

    def loss(X, Y):
        '''
        通過比較預測值和實際標籤來計算損失。
        引數 X: 輸入值
        引數 Y: 標籤
        返回值 : 返回損失
        '''
    
        # 做出預測
        Y_predicted = inference(X)
        return tf.reduce_sum(tf.squared_difference(Y, Y_predicted))/(2*data.shape[0])

    其中,這裡的含義:

    • reduce_sum: 計算一個張量各維度元素的和

    • suqared_difference: 返回(Y - Y_predicted) * (Y - Y_predicted) 的平方差

    • data.shape[0] : 資料集張量的形狀,即多少個樣本。

  • 梯度下降去優化損失過程,指定學習率

    # 訓練
    def train(loss):
        learning_rate = 0.0001
        return tf.train.GradientDescentOptimizer(learning_rate).minimize(loss)

      tf.train.GradientDescentOptimizer(learning_rate).minimize(loss) 

    • learning_rate: 學習率
    • minimize(loss): 最小優化損失。
    • return : 最小梯度下降op
  • 執行測試模型

    with tf.Session() as sess:
    
        # 初始化變數w 和 b.
        sess.run(tf.global_variables_initializer())
    
        # 得到 X,Y
        X, Y = inputs()
    
        # 返回訓練損失和訓練最小梯度下降op.
        train_loss = loss(X, Y)
        train_op = train(train_loss)
    
        # 打印出訓練步數和損失,100步
        for epoch_num in range(100):
            loss_value, _ = sess.run([train_loss,train_op],
                                     feed_dict={X: data[:,0], Y: data[:,1]})
    
            # 打印出訓練步數和損失
            print('epoch %d, loss=%f' %(epoch_num+1, loss_value))
    
            # 儲存 w 和 b 的值
            wcoeff, bias = sess.run([w, b])

    執行測試結果,可以從測試結果看出損失是越來越低的。 測試結果:

    步數 1, 損失:6564.060059
    步數 2, 損失:3004.490479
    步數 3, 損失:1399.077148
    步數 4, 損失:675.013550
    步數 5, 損失:348.451233
    步數 6, 損失:201.167343
    步數 7, 損失:134.740158
    步數 8, 損失:104.780640
    步數 9, 損失:91.268486
    步數 10, 損失:85.174332
    步數 11, 損失:82.425758
    步數 12, 損失:81.186127
    步數 13, 損失:80.627007
    步數 14, 損失:80.374840
    步數 15, 損失:80.261086
    步數 16, 損失:80.209785
    步數 17, 損失:80.186630
    步數 18, 損失:80.176178
    步數 19, 損失:80.171463
    步數 20, 損失:80.169312
    步數 21, 損失:80.168335
    步數 22, 損失:80.167892
    步數 23, 損失:80.167671
    步數 24, 損失:80.167580
    步數 25, 損失:80.167511
    步數 26, 損失:80.167473
    步數 27, 損失:80.167450
    步數 28, 損失:80.167442
    步數 29, 損失:80.167412
    步數 30, 損失:80.167397
    步數 31, 損失:80.167374
    步數 32, 損失:80.167366
    步數 33, 損失:80.167336
    步數 34, 損失:80.167336
    步數 35, 損失:80.167313
    步數 36, 損失:80.167290
    步數 37, 損失:80.167274
    步數 38, 損失:80.167252
    步數 39, 損失:80.167236
    步數 40, 損失:80.167221
    步數 41, 損失:80.167198
    步數 42, 損失:80.167183
    步數 43, 損失:80.167175
    步數 44, 損失:80.167152
    步數 45, 損失:80.167130
    步數 46, 損失:80.167130
    步數 47, 損失:80.167107
    步數 48, 損失:80.167084
    步數 49, 損失:80.167061
    步數 50, 損失:80.167046
    步數 51, 損失:80.167030
    步數 52, 損失:80.167007
    步數 53, 損失:80.166985
    步數 54, 損失:80.166977
    步數 55, 損失:80.166962
    步數 56, 損失:80.166939
    步數 57, 損失:80.166916
    步數 58, 損失:80.166916
    步數 59, 損失:80.166893
    步數 60, 損失:80.166870
    步數 61, 損失:80.166847
    步數 62, 損失:80.166832
    步數 63, 損失:80.166817
    步數 64, 損失:80.166801
    步數 65, 損失:80.166779
    步數 66, 損失:80.166763
    步數 67, 損失:80.166748
    步數 68, 損失:80.166725
    步數 69, 損失:80.166710
    步數 70, 損失:80.166687
    步數 71, 損失:80.166672
    步數 72, 損失:80.166649
    步數 73, 損失:80.166641
    步數 74, 損失:80.166618
    步數 75, 損失:80.166611
    步數 76, 損失:80.166573
    步數 77, 損失:80.166573
    步數 78, 損失:80.166550
    步數 79, 損失:80.166534
    步數 80, 損失:80.166512
    步數 81, 損失:80.166512
    步數 82, 損失:80.166489
    步數 83, 損失:80.166473
    步數 84, 損失:80.166451
    步數 85, 損失:80.166435
    步數 86, 損失:80.166412
    步數 87, 損失:80.166405
    步數 88, 損失:80.166374
    步數 89, 損失:80.166374
    步數 90, 損失:80.166344
    步數 91, 損失:80.166328
    步數 92, 損失:80.166313
    步數 93, 損失:80.166298
    步數 94, 損失:80.166290
    步數 95, 損失:80.166260
    步數 96, 損失:80.166237
    步數 97, 損失:80.166229
    步數 98, 損失:80.166206
    步數 99, 損失:80.166191
    步數 100, 損失:80.166176

     

  • 最後可以畫出模型,形象地描述

    Input_values = data[:,0]
    Labels = data[:,1]
    Prediction_values = data[:,0] * wcoeff + bias
    
    plt.plot(Input_values, Labels, 'ro', label='main')
    plt.plot(Input_values, Prediction_values, label='Predicted')
    
    plt.show()

    如下圖: