Introduction
- 目的是為了觀察模型的參數(權重、偏置),損失值等變量值的變化
- 觀察訓練情形如何,可以實時的於tensorboard中以圖形化的方式顯示
- 在大量資料且長時間的訓練能快速掌握目前訓練的情況
- 因此需添加變量在tensorboard中,觀察其變化狀況
收集變量
收集變量的代碼一般是寫在執行會話(Session)之前
scalar
使用tf.summary.scalar(name='',tensor)
收集對於損失函數、準確率等單值變量
name
:變量的名字 (在tensorboard後台顯示的名字)tensor
:欲蒐集哪個tensor變量
histogram
使用tf.summary.histogram(name='',tensor)
收集高維度的變量參數,權重(weight)、偏置(bias) 等
name
:變量的名字 (在tensorboard後台顯示的名字)tensor
:欲蒐集哪個tensor變量
image
使用tf.summary.image(name='',tensor)
收集輸入的圖片張量能顯示圖片
name
:變量的名字 (在tensorboard後台顯示的名字)tensor
:欲蒐集哪個tensor變量
合併變量寫入事件文件
使用tf.summary.merge_all()
,定義合併tensor的op,其會返回合併的op(於graph中定義)
merged = tf.summary.merge_all()
- 固定寫法
- 必須運行op才能執行
- 運行合併:
summary = sess.run(merged)
- 每次迭代都必須運行
- 返回一個事件文件的物件,用於添加到事件文件中
- 添加:
FileWriter.add_summary(summary,i)
i
:表示第幾次的值
- 添加:
範例
以之前使用的線性回歸範例代碼為例1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52import tensorflow as tf
def LinearRegression():
with tf.variable_scope("data_preparation"):
X = tf.random_normal([100,1],mean=1.75,stddev=0.5, name="x_data")
y_true = tf.matmul(X,[[0.7]]) + 0.8
with tf.variable_scope("LinearRegression_model_build"):
weight = tf.Variable(tf.random_normal([1,1],mean=0.0,stddev=1.0),name="w") #必須用變量定義才能優化(改變)
bias = tf.Variable(0.0,name="bias")
y_predict = tf.matmul(X,weight) + bias
with tf.variable_scope("loss_calculate"):
loss = tf.reduce_mean(tf.square(y_true - y_predict))
with tf.variable_scope("optimize"):
train_op = tf.train.GradientDescentOptimizer(0.1).minimize(loss)
#收集單值變量tensor
tf.summary.scalar("Loss",loss)
#收集高維度變量tensor
tf.summary.histogram("Weight",weight)
tf.summary.histogram("Bias",bias)
# 定義一個tensor合併的op
merged = tf.summary.merge_all()
init_var_op = tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init_var_op)
print("起始初始化權重:%f, 初始化偏置:%f"%(weight.eval(),bias.eval()))
# 建立事件文件(指定存放文件夾及graph)
FileWriter = tf.summary.FileWriter("./summary/",graph=sess.graph)
for i in range(1000):
sess.run(train_op)
# 運行tensor互相合併的op
summary = sess.run(merged)
# 將結果寫入事件文件
FileWriter.add_summary(summary,i)
if i%50 == 0:
print("優化%d次後 權重:%f, 優化偏置:%f" % (i,weight.eval(), bias.eval()))
if __name__ == '__main__':
LinearRegression()
Result
SCALARS
- 可以看到隨著迭代的次數增加loss值不斷地在下降,最後趨於收斂
HISTOGRAM
- weights及bias顯示不盡理想的原因是因為,histogram是以高維度去展示結果,而我們只有定一個值,使得其高斯分布的情性變得很奇怪
- 可以SCALARS蒐集只有單值的變量