【學習筆記】tensorflow實現一個簡單的線性回歸


准備知識

Tensorflow運算API

矩陣運算:tf.matmul(x, w)

平方:tf.square(error)

均值:tf.reduce_mean(error)

梯度下降API

tf.train.GradientDescentOptimizer(learning_rate):梯度下降優化

  • learning_rate:學習率
  • return:梯度下降op

簡單的線性回歸的實現

# 准備數據
x = tf.random_normal([200, 1], mean=1.2, stddev=0.6, name="x")
y = tf.matmul(x, [[0.5]]) + 0.8

# 建立線性回歸模型
weight = tf.Variable(tf.random_normal([1, 1], mean=0, stddev=1.0), name="weight")
bais = tf.Variable(0.0, name="bais")
# 預測值
y_predict = tf.matmul(x, weight) + bais

# 損失函數,均方誤差
loss = tf.reduce_mean(tf.square(y - y_predict))

# 梯度下降優化損失
train_op = tf.train.GradientDescentOptimizer(0.1).minimize(loss)

# 初始化op
init_op = tf.global_variables_initializer()

# 運行
with tf.Session() as sess:
    sess.run(init_op)

    for i in range(200):
        sess.run(train_op)

        print("第%d次優化的權重為%f,偏置為%f" % (i, weight.eval(), bais.eval()))

部分運行結果:

第0次優化的權重為1.317120,偏置為-0.072556
第1次優化的權重為1.240519,偏置為-0.088773
第2次優化的權重為1.199426,偏置為-0.078846
第3次優化的權重為1.152779,偏置為-0.071317
第4次優化的權重為1.125252,偏置為-0.052198
第5次優化的權重為1.097908,偏置為-0.033999
第6次優化的權重為1.081992,偏置為-0.010126
...
第194次優化的權重為0.503366,偏置為0.795440
第195次優化的權重為0.503219,偏置為0.795541
第196次優化的權重為0.503130,偏置為0.795662
第197次優化的權重為0.503025,偏置為0.795741
第198次優化的權重為0.502987,偏置為0.795893
第199次優化的權重為0.502896,偏置為0.796023

建立事件文件

tf.summary.FileWriter("./temp/tf/summary/test", graph=sess.graph)

打開TensorBoard:

$ tensorboard --logdir="./temp/tf/summary/test"

上圖的圖形比較亂,怎樣才能更加的直觀呢?

變量作用域

tensorflow提供了變量作用域和共享變量這樣的概念,有幾個重要的作用。

  • 讓模型代碼更加清晰,作用分明

通過tf.variable_scope()創建指定名字的變量作用域

上例加上變量作用域

    with tf.variable_scope("data"):
        # 准備數據
        x = tf.random_normal([200, 1], mean=1.2, stddev=0.6, name="x")
        y = tf.matmul(x, [[0.5]]) + 0.8

    with tf.variable_scope("model"):
        # 建立線性回歸模型
        weight = tf.Variable(tf.random_normal([1, 1], mean=0, stddev=1.0), name="weight")
        bais = tf.Variable(0.0, name="bais")
        # 預測值
        y_predict = tf.matmul(x, weight) + bais

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

    with tf.variable_scope("optimizer"):
        # 梯度下降優化損失
        train_op = tf.train.GradientDescentOptimizer(0.1).minimize(loss)

再次觀察圖形:

增加變量顯示

目的:觀察模型的參數、損失值的變化情況

1、收集變量

  • tf.summary.scalar(name=’’,tensor) 收集對於損失函數和准確率等單值變量,name為變量的名字,tensor為值

  • tf.summary.histogram(name=‘’,tensor) 收集高維度的變量參數

  • tf.summary.image(name=‘’,tensor) 收集輸入的圖片張量能顯示圖片

2、合並變量寫入事件文件

  • merged = tf.summary.merge_all()

  • 運行合並:summary = sess.run(merged),每次迭代都需運行

  • 添加:FileWriter.add_summary(summary,i),i表示第幾次的值

收集上例中的損失、權重

# 收集tensor
tf.summary.scalar("losses", loss)
tf.summary.histogram("weights", weight)
# 定義合並tensor的op
merged = tf.summary.merge_all()

合並到事件流

# 運行合並的tensor
summary = sess.run(merged)
fw.add_summary(summary, i)

模型的保存與加載

在我們訓練或者測試過程中,總會遇到需要保存訓練完成的模型,然后從中恢復繼續我們的測試或者其它使用。模型的保存和恢復也是通過tf.train.Saver類去實現,它主要通過將Saver類添加OPS保存和恢復變量到checkpoint。它還提供了運行這些操作的便利方法。

tf.train.Saver(var_list=None,max_to_keep=5)

  • var_list:指定將要保存和還原的變量。它可以作為一個dict或一個列表傳遞.
  • max_to_keep:指示要保留的最近檢查點文件的最大數量。創建新文件時,會刪除較舊的文件。如果無或0,則保留所有檢查點文件。默認為5(即保留最新的5個檢查點文件。)

自定義命令行參數

tf.app.run(),默認調用main()函數,運行程序。main(argv)必須傳一個參數。

tf.app.flags,它支持應用從命令行接受參數,可以用來指定集群配置等。在tf.app.flags下面有各種定義參數的類型

  • DEFINE_string(flag_name, default_value, docstring)
  • DEFINE_integer(flag_name, default_value, docstring)
  • DEFINE_boolean(flag_name, default_value, docstring)
  • DEFINE_float(flag_name, default_value, docstring)

第一個也就是參數的名字,路徑、大小等等。第二個參數提供具體的值。第三個參數是說明文檔

tf.app.flags.FLAGS,在flags有一個FLAGS標志,它在程序中可以調用到我們前面具體定義的flag_name.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM