TF中的一元線性迴歸

整體認識

  1. 線性迴歸,是利用已有數據擬合,實現對於未知數據的預測。
  2. 輸入的數據即爲樣本,分爲有標籤樣本與無標籤樣本;所謂標籤就是對於樣本屬性的描述,如在圖像分類中,有標籤的圖像就是帶有類別信息的圖像,這個類別就是標籤。
  3. 此文中使用的是有標籤的一維數據集,每個樣本可以用(x,y)這樣的表示方式;而擬合就是要得到一個映射關係,記作h,x經h映射得到預測結果y'(即h(x)=y'),這就構建了一個模型,而h又稱爲假設函數。
  4. 訓練模型就是要找到一個合適的假設函數,使得預測結果足夠接近標籤;用loss即損失值表示這種接近程度,理想情況下,loss越接近0越好。
  5. loss有多種表示方法,如L1,即差的絕對值和;L2,即均方差其公式爲:loss = \frac{1}{N}\sum(y-h(x))^{2},L2使用更廣泛。

訓練

  1. 訓練以減小loss爲目的,不斷優化假設函數的參數;優化的方法包括但不限於梯度下降算法。
  2. 所謂梯度下降算法,就是迭代時總是向梯度下降的方向更新參數,總體的loss將在不斷迭代時變小,當loss不變或者變化極小時認爲此時模型收斂,即可停止訓練。
  3. 梯度下降時的步長是一個超參,即學習率;若學習率爲0.01,求得的梯度值爲2.5,則下次迭代下降的距離與當前0.025的位置。
  4. 除了學習率是超參,網絡層數,各層的神經元數,filters尺寸都是超參。

一元線性迴歸實例

  1. 整體步驟: 準備數據--->構建模型--->訓練模型--->進行預測
  2. import tensorflow as tf
    import numpy as np
    import matplotlib.pyplot as plt
    
    # 數據準備
    np.random.seed(5)
    x_data = np.linspace(-1, 1, 100)
    y_data = x_data*2+np.random.rand(*x_data.shape)*0.4
    plt.figure()
    plt.scatter(x_data, y_data)
    
    
    
    # 構建模型 x*w+b
    x = tf.placeholder('float', name='x')
    y = tf.placeholder('float', name='y')
    w = tf.Variable(1.0, name='w0')
    b = tf.Variable(0.0, name='b0')
    
    
    def model(x, w, b):
        return(tf.multiply(x, w)+b)
    
    # 建立模型操作
    preb = model(x, w, b)
    
    # 超參設定
    train_epochs = 10  # 訓練輪數
    learning_rate = 0.05  # 學習率
    loss_function = tf.reduce_mean(tf.square(y-preb))  # 利用均方差做loss
    optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss_function)
    step = 0  # 步數計數
    disply_step = 10  # 顯示loss的粒度
    loss_list = []  # loss集合
    # 運行與訓練
    sess = tf.Session()
    init = tf.global_variables_initializer()
    sess.run(init)
    
    # 逐次執行超參設定的輪數
    for epoch in range(train_epochs):
        for xs, ys in zip(x_data, y_data):  # zip將x,y表示爲(x,y)格式
            _, loss = sess.run([optimizer, loss_function], feed_dict={x: xs, y: ys})
            loss_list.append(loss)
            step = step + 1
            if step % disply_step == 0:  # 對應粒度下顯示loss值
                print(loss)
        b0temp = b.eval(session=sess)  # 在session會話下求值
        w0temp = w.eval(session=sess)
        plt.plot(x_data, x_data*w0temp+b0temp)  # 每次訓練一輪將得到的結果繪製
    
    
    plt.figure()
    plt.plot(loss_list, 'r+')  #繪製總的loss
    plt.show()
    
    
    
    具體代碼如上。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章