TensorBoard中的scalar观察标量(损失值)的变化情况如下图:
模型的保存和加载可以避免模型在训练一半时突然宕机造成训练模型数据的丢失。可以通过加载模型从上次的检测点(checkpoint)的位置继续训练模型。
demo.py(手动实现线性回归,TensorBoard中添加变量的变化显示,模型的保存和加载,命令行参数):
import tensorflow as tf
import os
os.environ['TF_CPP_MIN_LOG_LEVEL']='2' # 设置警告级别
# 定义命令行参数
# 参数顺序:名字,默认值,说明
tf.app.flags.DEFINE_integer("max_step", 500, "模型训练的步数")
tf.app.flags.DEFINE_string("model_dir", " ", "模型文件的加载的路径")
# 命令行中的运行命令: python demo.py --max_step=500 --model_dir="./ckpt/mymodel"
# 通过下面的FLAGS获取命令行参数
FLAGS = tf.app.flags.FLAGS # 取一个简单的别名
def myregression():
"""
手动实现一个线性回归预测
:return: None
"""
# 创建变量的作用域,为了让代码看起来更清爽。 TensorBoard中的图根据作用域显示也会更清爽。
with tf.variable_scope("data"):
# 1、准备数据,x 特征值 [100, 1] y 目标值[100]
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("model"):
# 2、建立线性回归模型 1个特征,1个权重, 一个偏置 y = w x + b
# 随机给一个权重和偏置的值,让他去计算损失,然后再当前状态下优化
# 用变量定义权重(系数)才能优化(变化)
# trainable参数:指定这个变量能根据梯度下降进行优化(变化)(默认True)
weight = tf.Variable(tf.random_normal([1, 1], mean=0.0, stddev=1.0), name="w", trainable=True) # 初始权重
bias = tf.Variable(0.0, name="b") # 初始偏置
y_predict = tf.matmul(x, weight) + bias
with tf.variable_scope("loss"):
# 3、建立损失函数,均方误差
loss = tf.reduce_mean(tf.square(y_true - y_predict))
with tf.variable_scope("optimizer"):
# 4、梯度下降优化损失 leaning_rate: 学习率(步长),一般设置(0,1)之间。学习率并不是一个超参数,它不会影响最终优化的结果。
train_op = tf.train.GradientDescentOptimizer(0.1).minimize(loss)
# 1、收集tensor
tf.summary.scalar("losses", loss) # 标量
tf.summary.histogram("weights", weight) # 高纬度的值。 (这里的weight也可以通过标量的形式收集)
# 合并收集的变量的op (合并变量,一次性写入事件文件,通过TensorBoard进行可视化)
merged = tf.summary.merge_all()
# 定义一个初始化变量的op
init_op = tf.global_variables_initializer()
# 定义一个保存模型的实例
saver = tf.train.Saver()
# 通过会话运行程序
with tf.Session() as sess:
# 初始化变量
sess.run(init_op)
# 打印随机最先初始化的权重和偏置
print("随机初始化的参数权重为:%f, 偏置为:%f" % (weight.eval(), bias.eval()))
# 建立事件文件
filewriter = tf.summary.FileWriter("./tmp/summary/test/", graph=sess.graph)
# 加载模型,覆盖模型当中随机定义的参数,从上次训练的参数结果开始训练
if os.path.exists("./tmp/ckpt/checkpoint"):
saver.restore(sess, FLAGS.model_dir) # FLAGS获取命令行参数(模型的保存路径和模型名)
# 循环训练(迭代) 运行梯度下降的优化操作
for i in range(FLAGS.max_step): # FLAGS获取命令行参数
sess.run(train_op) # 运行梯度下降的优化操作
# 运行合并变量的op (每次迭代都需运行)
summary = sess.run(merged)
filewriter.add_summary(summary, i) # 将收集的变量写入事件文件,i表示第i次的值。
print("第%d次优化的参数权重为:%f, 偏置为:%f" % (i, weight.eval(), bias.eval()))
# 保存模型(保存模型的系数,变量)。 可以根据i的值控制模型的保存频率。
saver.save(sess, FLAGS.model_dir) # 保存的变量属于资源,所以需要会话。 FLAGS获取命令行参数(模型的保存路径和模型名)
return None
if __name__ == "__main__":
myregression()