初步實作
tensorflow自帶有非常強大的可視化功能tensorboard
import tensorflow as tf
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
a = tf.constant(32.11, name="a")
b = tf.constant(30.215, name='b')
c = a + b
var = tf.Variable(tf.random_normal(shape=[2, 3], mean=0.0, stddev=1.0))
# 顯示初始化
init_op = tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init_op)
# 把程式圖寫進summary事件檔案
tf.summary.FileWriter("/Users/lawa/PycharmProjects/tens/tmp/summary", graph=sess.graph)
sess.run([c, var])
運作程式生成事件檔案
指令行運作
tensorboard --logdir=/Users/lawa/PycharmProjects/tens/tmp/summary
如果/Users/lawa/PycharmProjects/tens/tmp/summary裡有多個事件檔案,預設選擇最新的一個
界面展示(不同的版本可能布局不一樣)
- SCALARS:展示訓練過程中的準确率、損失值、權重/偏置的變化情況,一般是單個數值
- IMAGES:展示訓練過程中及記錄的圖像
- AUDIO:展示訓練過程中記錄的音頻
- GRAPHS:展示模型的資料流圖,以及各個裝置上消耗的記憶體和時間
- DISTRIBUTIONS:展示訓練過程中記錄的資料的分布圖
- HISTOGRAMS:展示訓練過程中記錄的資料的柱狀圖 一般是多元資料
- EMBEDDINGS:展示詞向量後的投影分布
訓練過程可視化
代碼
import tensorflow as tf
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
def generate_data():
x = tf.random_normal([100, 1], mean=1.75, stddev=0.5, name='x')
y = tf.matmul(x, [[0.6]]) + 3
return x, y
def myregression():
"""
自實作線性回歸
:return:
"""
# 變量作用域,在可視化的時候更有條理
with tf.variable_scope('data'):
x, y = generate_data()
with tf.variable_scope('modle'):
# 建立模型 y = x * a + b
a = tf.Variable(tf.random_normal([1, 1], mean=0.0, stddev=1.0), name='weight_a')
b = tf.Variable(0.0, name='bias_b')
y_predict = tf.matmul(x, a) + b
with tf.variable_scope('loss'):
# 建立損失函數
loss = tf.reduce_mean(tf.square(y_predict - y))
with tf.variable_scope('opyimizer'):
# 訓練
train_op = tf.train.GradientDescentOptimizer(0.1).minimize(loss=loss)
# 收集變量顯示在tensorboard上
tf.summary.scalar('loss', loss)
tf.summary.histogram('weight', a)
tf.summary.scalar('bias_b', b)
# 合并變量
merged = tf.summary.merge_all()
init_op = tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init_op)
print('初始的權重:%f偏置值:%f' % (a.eval(), b.eval()))
filewriter = tf.summary.FileWriter('/Users/lawa/PycharmProjects/tens/tmp/summary', graph=sess.graph)
# 訓練優化
for i in range(1, 350):
sess.run(train_op)
# 每訓練一次就收集一次變量
filewriter.add_summary(sess.run(merged), i)
print('第%d次優化的權重:%f偏置值:%f' % (i, a.eval(), b.eval()))
if __name__ == '__main__':
myregression()
scalars裡偏置值和loss損失的變化趨勢,可以看到訓練到200步的時候loss就已經很低了,之後的變化很小
graph中的計算圖,data,model等就是我們定義的變量作用域
distributions和histograms裡的權重變化,由于histograms是多元的,看起來可能不是很清楚