Python之TensorFlow的變量收集、自定義命令參數、矩陣運算、梯度下降-4

  一、TensorFlow爲什麼要存在變量收集的過程,主要目的就是把訓練過程中的數據,比如loss、權重、偏置等數據通過圖形展示的方式呈現在開發者的眼前。

    自定義參數:自定義參數,主要是通過Python去執行,然後傳入對應的參數。常見的有路徑、訓練次數等。

    梯度下降:這個應該是最常見的訓練手段了,在監督學習中,基本上都是採用這種方式,所以瞭解其中的使用過程還是很多必要的。

  二、變量收集

    tf.summary.scalar(<name>, <tensor>):通過標量的方式來統計數據(簡單一點有點像曲線圖的方式,一般用於loss、accuary的收集)

    tf.summary.histogram(<name>, <values>):直方圖的形式展示、一般用於高緯度的數據收集。

    merged = tf.summary.merge_all():合併數據,返回收集到的數據

    summary = sess.run(merged):運行收集到數據

    file_write = tf.summary.FileWriter(<logdir>,<graph=None>):記錄收集數據的writer

    file_write.add_summary(<summary>, <global_step=None>):寫入收集的數據,global_step爲每一步長

  三、自定義命令參數

    1)首先聲明需要傳入的參數   

tf.flags.DEFINE_integer("max_step", 2000, "最大訓練次數")

FLAGS = tf.flags.FLAGS

    注意:這裏的數據類型,可以自己更具需要傳入

tf.flags.DEFINE_integer(<name>, <default_value>, <desc>)
tf.flags.DEFINE_string(<name>, <default_value>, <desc>)

    2)替換需要手動傳入的部分

for i in range(FLAGS.max_step):   
獲取參數:
            定義:
                FLAGS = tf.flags.FLAGS
            獲取:
                FLAGS.<name>

 

    3)通過Python的方式去執行*.py文件,帶入參數

python <py_name> --<name>=<value>

  四、矩陣運算

矩陣運算:
        乘法:tf.matmul(x, y)
        平方:tf.square(error)
        均值:tf.reduce_mean(error)

  說明:矩陣運算,這裏只是一少部分,實際開發中用到的需要自行查閱

  五、梯度下降

線性迴歸步驟:
        1、準備特徵數據和目標值
        2、建立模型 y = wx + b,主要求解w,b的值
        3、計算損失值:誤差loss均方誤差(y1-y1')^2 + ... + (yn - yn')^2 / n 其中:yn爲特徵值矩陣,yn'爲平均值矩陣
        4、梯度下降,優化損失過程,需要指定學習率
梯度下降:
        tf.train.GradientDescentOptimizer(learning_rate)
        method: minimize(loss)
        return: 梯度下降op
        學習率:
            如果學習率過大會出現梯度消失/梯度爆炸導致NaN
            優化:
                1、重新設計網絡
                2、調整學習率
                3、使用梯度截斷
                4、使用激活函數

  六、代碼演示

import os
import tensorflow as tf

# tf.flags.DEFINE_integer("max_step", 2000, "最大訓練次數")
#
# FLAGS = tf.flags.FLAGS

def tensorflow_linear_regression():
    with tf.variable_scope("data"):
        # 1、準備特徵值和目標值
        x = tf.random_normal([100, 1], mean=1.75, stddev=0.5, name="x")
        # 矩陣相乘必須是二維(爲了模擬效果而設定固定值來訓練)
        y_true = tf.matmul(x, [[0.7]]) + 0.8

    with tf.variable_scope("model"):
        # 2、建立迴歸模型,隨機給權重值和偏置的值,讓他去計算損失,然後在當前狀態下優化
        # 模型 y = wx + b, w的個數根據特徵數據而定,b隨機
        # 其中Variable的參數trainable可以指定變量是否跟着梯度下降一起優化(默認True)
        w = tf.Variable(tf.random_normal([1, 1], mean=0.0, stddev=1.0), name="w", trainable=True)
        b = tf.Variable(0.0, name="b")
        # 預測值
        y_predict = tf.matmul(x, w) + b

    with tf.variable_scope("loss"):
        # 3、建立損失函數,均方誤差
        loss = tf.reduce_mean(tf.square(y_true - y_predict))

    with tf.variable_scope("optimizer"):
        # 4、梯度下降優化損失
        # 學習率的控制非常重要,如果過大會出現梯度消失/梯度爆炸導致NaN
        train_op = tf.train.GradientDescentOptimizer(learning_rate=0.1).minimize(loss)

    # 1)收集變量
    tf.summary.scalar("losses", loss)
    tf.summary.histogram("ws", w)

    # 2)合併變量
    merged = tf.summary.merge_all()

    tf.add_to_collection("y_predict", y_predict)

    # 定義一個初始化變量的op
    init_op = tf.global_variables_initializer()

    # 定義保存模型
    saver = tf.train.Saver()

    # 通過繪畫運行程序
    with tf.Session() as sess:
        sess.run(init_op)
        print("運行前,權重值:%f, 偏置:%f" % (w.eval(), b.eval()))
        file_write = tf.summary.FileWriter("tmp/summary/regression", sess.graph)

        # 加載上次訓練的模型結果
        if os.path.exists("model/checkpoint/checkpoint"):
            saver.restore(sess, "model/checkpoint/model")

        # 循環訓練
        for i in range(2000):
        # python tensorflow_linear_regression_demo.py --max_step=1000
        # for i in range(FLAGS.max_step):
            sess.run(train_op)
            print("運行 %d 後,權重值:%f, 偏置:%f" % (i + 1, w.eval(), b.eval()))

            # 運行合併後的數據
            summary = sess.run(merged)
            file_write.add_summary(summary, i)

            # 保存模型
            if (i + 1) % 100 == 0:
                saver.save(sess, "model/checkpoint/model")
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章