【深度學習】TensorFlow線性迴歸案例演示(3)

語言: CN / TW / HK

highlight: a11y-dark theme: nico


持續創作,加速成長!這是我參與「掘金日新計劃 · 10 月更文挑戰」的第20天,點擊查看活動詳情

1. 案例回顧

上一篇文章我們搭建了完整線性迴歸模型並進行1000輪訓練,達到了較為不錯的效果。本文將主要介紹在完整機器學習中的其他功能與流程,比如將訓練損失可視化,Tensorboard顯示變量,自定義增加命名空間,模型保存等等。

2. 增加變量顯示

在TensorBoard當中觀察模型的參數、損失值等變量值的變化。不同的數據要用不同的方式去收集,比如標量數據用.scalar,高維度數據用.histogram等。

收集變量: - tf.summary.scalar(name='', tensor)收集對於損失函數和準確率等單值變量(標量),name為變量的名字,tensor為值。 - tf.summary.histogram(name='', tensor)收集高維度的變量參數(權重和偏置變化狀況) - tf.summary.image(name='', tensor)收集輸入的圖片張量能顯示圖片

合併變量寫入事件文件 - merged=tf.summary.merge_all():將權重偏置都蒐集到一起 - 運行合併:summary = sess.run(merged),每次迭代都需在會話中運行 - 添加:FileWriter.add_summary(summary, i)i表示第幾次的值,將summary對象寫入到事件文件中

3. 代碼演示

步驟1:導入所需庫

ipython import tensorflow as tf import tensorflow.compat.v1 as tf tf.disable_v2_behavior()

步驟2:線性迴歸並收集變量

  • 我們在./File/linear目錄下創建了事件文件,用來保存變量中間結果
  • 需要在訓練時的每一次循環後將變量寫入事件
  • 本案例演示中,主要用到收集變量與變量合併寫入事件,最終得到可視化結果
  • 主要流程為:

    1. 創建事件
    2. 收集變量
    3. 合併變量
    4. 寫入變量 ```ipython def linear_regression(): """ 實現線性迴歸 """

    1.1 準備數據

    X = tf.random_normal(shape=[100,1]) y_true = tf.matmul(X, [[0.5]]) + 1 # matmul矩陣運算

    1.2 模型構造

    定義模型參數

    用變量來定義

    weights = tf.Variable(initial_value=tf.random_normal(shape=[1,1])) # 需要給一個初始設置:正態分佈隨機初始值;一行一列 bias = tf.Variable(initial_value=tf.random_normal(shape=[1,1])) y_predict = tf.matmul(X, weights) + bias

    1.3 損失函數

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

    1.4 優化損失

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

    2) 收集變量

    tf.summary.scalar("error", error) tf.summary.histogram("weights", weights) tf.summary.histogram("bias", bias)

    3) 合併變量

    merged = tf.summary.merge_all()

    2. 初始化變量

    init = tf.global_variables_initializer()

    3. 開啟會話

    with tf.Session() as sess: sess.run(init)

    # 1) 創建事件文件
    file_writer = tf.summary.FileWriter("./File/linear", graph=sess.graph)
    
    # 查看初始化模型參數的值
    print("訓練前模型參數為:權重%f, 偏置%f, 損失%f" %(weights.eval(), bias.eval(), error.eval()))
    
    # 4. 開始訓練
    for i in range(1000):
        sess.run(optimizer)
        print("第%d次訓練後模型參數為:權重%f, 偏置%f, 損失%f" %(i+1, weights.eval(), bias.eval(),error.eval()))
    
        # 運行合併變量操作
        summary = sess.run(merged)
        # 將每次迭代後的變量寫入事件文件
        file_writer.add_summary(summary, i)
    

    return None

linear_regression() ``` 經過1000輪訓練得到的結果如下圖所示:

image.png

步驟3:TensorBoard可視化

同時,我們還在當前目錄下建立了新的目錄,File/linear。在這個目錄下記錄了變量的變化過程,我們可以使用Tensorboard將其打開,查看可視化訓練過程。

image.png

File文件中是剛才保存變量的事件,需要Tensorboard將其打開查看。

image.png

需要我們打開anaconda promp,然後在其中進入到安裝tensorflow的虛擬環境中。進入到事件所在上級目錄。

cd 文件保存上級目錄path

tensorboard --logdir=./File/linear/

可視化圖結果如下所示:

image.png

模型損失變化圖如下所示:

image.png

權重weight與偏置bias項變化過程如下所示:

image.png

權重weight與偏置bias分佈直方圖如下所示:

image.png