【深度學習】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