初步實現
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是多維的,看起來可能不是很清楚