准備知識
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.
