Hike News
Hike News

深度學習-tensorflow基礎-變量顯示

Introduction

  • 目的是為了觀察模型的參數(權重、偏置),損失值等變量值的變化
  • 觀察訓練情形如何,可以實時的於tensorboard中以圖形化的方式顯示
    • 在大量資料且長時間的訓練能快速掌握目前訓練的情況
  • 因此需添加變量在tensorboard中,觀察其變化狀況
    1. 收集變量
    2. 合併變量寫入事件文件中

收集變量

收集變量的代碼一般是寫在執行會話(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
52
import 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

Imgur

  • 可以看到隨著迭代的次數增加loss值不斷地在下降,最後趨於收斂

HISTOGRAM

Imgur

  • weights及bias顯示不盡理想的原因是因為,histogram是以高維度去展示結果,而我們只有定一個值,使得其高斯分布的情性變得很奇怪
  • 可以SCALARS蒐集只有單值的變量

DISTRIBUTIONS

Imgur