首頁 > 軟體

TensorFlow實現簡單線性迴歸

2022-03-30 19:03:36

本文範例為大家分享了TensorFlow實現簡單線性迴歸的具體程式碼,供大家參考,具體內容如下

簡單的一元線性迴歸

一元線性迴歸公式:

其中x是特徵:[x1,x2,x3,…,xn,]T
w是權重,b是偏置值

程式碼實現

匯入必須的包

import tensorflow as tf
import matplotlib.pyplot as plt
import numpy as np
import os

# 遮蔽warning以下的紀錄檔資訊
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'

產生模擬資料

def generate_data():
    x = tf.constant(np.array([i for i in range(0, 100, 5)]).reshape(-1, 1), tf.float32)
    y = tf.add(tf.matmul(x, [[1.3]]) + 1, tf.random_normal([20, 1], stddev=30))
    return x, y

x是100行1列的資料,tf.matmul是矩陣相乘,所以權值設定成二維的。
設定的w是1.3, b是1

實現迴歸

def myregression():
    """
    自實現線性迴歸
    :return:
    """
    x, y = generate_data()
    #     建立模型  y = x * w + b
    # w 1x1的二維資料
    w = tf.Variable(tf.random_normal([1, 1], mean=0.0, stddev=1.0), name='weight_a')
    b = tf.Variable(0.0, name='bias_b')

    y_predict = tf.matmul(x, a) + b

    # 建立損失函數
    loss = tf.reduce_mean(tf.square(y_predict - y))
    
    # 訓練
    train_op = tf.train.GradientDescentOptimizer(0.1).minimize(loss=loss)

    # 初始化全域性變數
    init_op = tf.global_variables_initializer()

  
    with tf.Session() as sess:
        sess.run(init_op)
        print('初始的權重:%f偏置值:%f' % (a.eval(), b.eval()))
    
        # 訓練優化
        for i in range(1, 100):
            sess.run(train_op)
            print('第%d次優化的權重:%f偏置值:%f' % (i, a.eval(), b.eval()))
        # 顯示迴歸效果
        show_img(x.eval(), y.eval(), y_predict.eval())

使用matplotlib檢視迴歸效果

def show_img(x, y, y_pre):
    plt.scatter(x, y)
    plt.plot(x, y_pre)
    plt.show()

完整程式碼

import tensorflow as tf
import matplotlib.pyplot as plt
import numpy as np
import os

os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'


def generate_data():
    x = tf.constant(np.array([i for i in range(0, 100, 5)]).reshape(-1, 1), tf.float32)
    y = tf.add(tf.matmul(x, [[1.3]]) + 1, tf.random_normal([20, 1], stddev=30))
    return x, y


def myregression():
    """
    自實現線性迴歸
    :return:
    """
    x, y = generate_data()
    # 建立模型  y = x * w + b
    w = tf.Variable(tf.random_normal([1, 1], mean=0.0, stddev=1.0), name='weight_a')
    b = tf.Variable(0.0, name='bias_b')

    y_predict = tf.matmul(x, w) + b

    # 建立損失函數
    loss = tf.reduce_mean(tf.square(y_predict - y))
    # 訓練
    train_op = tf.train.GradientDescentOptimizer(0.0001).minimize(loss=loss)

    init_op = tf.global_variables_initializer()

    with tf.Session() as sess:
        sess.run(init_op)
        print('初始的權重:%f偏置值:%f' % (w.eval(), b.eval()))
        # 訓練優化
        for i in range(1, 35000):
            sess.run(train_op)
            print('第%d次優化的權重:%f偏置值:%f' % (i, w.eval(), b.eval()))
        show_img(x.eval(), y.eval(), y_predict.eval())


def show_img(x, y, y_pre):
    plt.scatter(x, y)
    plt.plot(x, y_pre)
    plt.show()


if __name__ == '__main__':
    myregression()

看看訓練的結果(因為資料是隨機產生的,每次的訓練結果都會不同,可適當調節梯度下降的學習率和訓練步數)

35000次的訓練結果

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


IT145.com E-mail:sddin#qq.com