初步实现
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是多维的,看起来可能不是很清楚