8、线性回归模型原理与实现(三)——增加损失值等变量的显示,模型的保存和加载,自定义命令行参数
1、增加损失值等变量的显示。目的:添加权重参数,损失值等后,在tensorboard观察变化的情况
(1)收集变量 (代码直接写在会话之前)
● tf.summary.scalar(name=",tensor) 收集对于损失函数和准确率等单值变量,name为变量的名字,tensor为值
● tf.summary.histogram(name=",tensor)收集高维度的变量参数
● tf.summary.image(name=",tensor)收集输入的图片张量能显示图片
1 # 1. 在会话之前收集变量,收集tensor 2 tf.summary.scalar("losses",loss) #收集标量 3 tf.summary.histogram("weights",weights)
(2)合并变量写入事件文件
① merged = tf.summary.merge_all()
② 运行合并: summary = sess.run(merged), 每次迭代都需运行
1 # 2. 定义合并tensor的op 2 merged = tf.summary.merge_all()
③ 添加: FileWriter.add_ summary(summary,i),i表示第几次的值
1 for i in range(FLAGS.max_step): 2 sess.run(train_op) 3 4 # 1. 运行合并的tensor 5 summary = sess.run(merged) 6 # 2.加进filewriter中 7 fileWriter.add_summary(summary,i) 8 9 print(("第%s次优化后的参数,权重为: %f, 偏置为: %f"%(i,weights.eval(),bias.eval())))
2、模型的保存和加载
背景:当一个模型的训练需要很长时间的时候,一旦中途中断那么必将造成损失,因此,我们需要模型可以实时的保存
tf.train.Saver(var_list=None,max_to_keep=5)
●var_list:指定将要保存和还原的变量。它可以作为一个dict或一个列表传递.
●max_to_keep:指示要保留的最近检查点文件的最大数量。
创建新文件时,会删除较旧的文件。如果无或0,则保留所有检查点文件。默认为5 (即保留最新的5个检查点文件。
●例如: saver.save(sess, /tmp/ckpt/test/model') 这里保存是会话sess
1 #定义一个保存模型的op 2 saver = tf.train.Saver()
1 # 在程序运行结束的时候保存,也可以在循环中保存 2 saver.save(sess,"E:/pythonprogram/deepLearning/线性回归实现/ckpt/regression_model") #保存模型的目录,后面要加上模型的名字
●saver.restore(sess, /tmp/ckpt/test/model) 模型加载
1 #加载模型,覆盖模型当中随机定义的参数,从上次训练的参数结果开始,将模型中的值对要训练的值进行覆盖,先判断文件是否存在 2 if os.path.exists("E:/pythonprogram/deepLearning/线性回归实现/ckpt/checkpoint"): 3 saver.restore(sess, r"E:\pythonprogram\deepLearning\线性回归实现\ckpt\regression_model")
●保存文件格式: checkpoint文件
summary:events文件,保存模型的文件:checkpoint(即检查点文件)
3、自定义命令行参数
(1)tf.app.flags,它支持应用从命令行接受参数,可以用来指定集群配置等。在tf.app.flags 下面有各种定义参数
的类型
● DEFINE_ string(flag. name, default value, docstring)
● DEFINE integer(flag. name, default. value, docstring)
● DEFINE. boolean(flag. name, default, value, docstring)
● DEFINE float(lag. name, default value, docstring)
(2)tf.app.flags.,在flags有一个FLAGS标志, 它在程序中可以调用到我们
前面具体定义的flag_name 定义命令行参数
①首先定义有哪些参数需要在运行时候指定
- tf.app.flags.DEFINE_integer("max_step",100,"模型训练的步数")
- tf.app.flags.DEFINE_string("model_dir","","模型文件加载的路径")
②程序当中获取定义命令行参数 FLAGS = tf.app.flags.FLAGS
在命令行执行的时候,使用如python **.py --max_step 300
完整代码:
1 import tensorflow as tf 2 import os 3 os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' #去掉警告,将警告级别提升 4 # 参数:名字,默认值,说明 5 tf.app.flags.DEFINE_integer("max_step",100,"模型训练的步数") 6 # 使用参数 7 FLAGS = tf.app.flags.FLAGS 8 9 10 def my_regression(): 11 12 with tf.variable_scope("data"): #准备数据(即“data”)的作用域 13 # 1. 准备数据 [X, 特征值] 这里假设是100个样本,1个特征,即[100, 1], 目标值y是100个值,即[100] 14 x = tf.random_normal([100,1], mean=1.75, stddev=0.5, name="x_data") #自己定义一个假的数据集 15 y_ture = tf.matmul(x, [[0.7]]) + 0.8 #矩阵相乘,w值必须设置成相应的维数 16 17 with tf.variable_scope("model"): #模型的作用域 18 # 2. 建立线性回归模型 1个特征-->1个权重值, 一个偏置 y = x * w +b 19 # 随机给一个权重和偏置值, 然后计算损失函数,利用梯度下降在当前状态下优化损失函数 20 # 用变量定义才能优化 21 weights = tf.Variable(tf.random_normal([1,1],mean=0.0, stddev=1.0), name="w", trainable=True) #模型中的参数要用变量进行定义,在括号里面给一个随机的值,让模型从该值开始优化 22 bias = tf.Variable(0.0, name="b") #定义变量 23 y_predict = tf.matmul(x, weights) + bias #预测值 24 25 with tf.variable_scope("loss"): #损失的作用域 26 # 3. 建立计算损失函数,均方误差 27 loss = tf.reduce_mean(tf.square(y_ture - y_predict)) #平方之后,相加再除以总数 28 29 with tf.variable_scope("optimizer"): #优化的作用域 30 # 4. 梯度下降优化损失op (学习率: learning_rate) 31 train_op = tf.train.GradientDescentOptimizer(0.1).minimize(loss) #最小化损失 0.1是学习率(步长),自己调 32 33 # 1. 在会话之前收集变量,收集tensor 34 tf.summary.scalar("losses",loss) #收集标量 35 tf.summary.histogram("weights",weights) 36 # 2. 定义合并tensor的op 37 merged = tf.summary.merge_all() 38 39 #定义一个初始化的op,对所有的变量进行初始化,这样才能在会话中进行打印 40 init_op = tf.global_variables_initializer() 41 42 #定义一个保存模型的op 43 saver = tf.train.Saver() 44 45 #通过会话运行程序(op) 46 with tf.Session() as sess: 47 #初始化变量 48 sess.run(init_op) 49 # 打印优化前的初始化值 50 print("随机初始化的参数,权重为: %f, 偏置为: %f"%(weights.eval(),bias.eval())) 51 52 #可视化,建立事件文件 53 fileWriter = tf.summary.FileWriter("E:/pythonprogram/deepLearning/base/visual/", graph=sess.graph) # 有一个返回值 54 55 #加载模型,覆盖模型当中随机定义的参数,从上次训练的参数结果开始,将模型中的值对要训练的值进行覆盖 56 if os.path.exists("E:/pythonprogram/deepLearning/线性回归实现/ckpt/checkpoint"): 57 saver.restore(sess, r"E:\pythonprogram\deepLearning\线性回归实现\ckpt\regression_model") 58 59 # 运行优化 60 for i in range(FLAGS.max_step): 61 sess.run(train_op) 62 63 # 1. 运行合并的tensor 64 summary = sess.run(merged) 65 # 2.加进filewriter中 66 fileWriter.add_summary(summary,i) 67 68 print(("第%s次优化后的参数,权重为: %f, 偏置为: %f"%(i,weights.eval(),bias.eval()))) 69 70 # 在程序运行结束的时候保存,也可以在循环中保存 71 saver.save(sess,"E:/pythonprogram/deepLearning/线性回归实现/ckpt/regression_model") #保存模型的目录,后面要加上模型的名字 72 73 if __name__ == '__main__': 74 my_regression()
输出:
随机初始化的参数,权重为: 1.036833, 偏置为: 0.000000 第0次优化后的参数,权重为: 1.092212, 偏置为: 0.043446 第1次优化后的参数,权重为: 1.092914, 偏置为: 0.055006 第2次优化后的参数,权重为: 1.078629, 偏置为: 0.059111 . . . 第297次优化后的参数,权重为: 0.711910, 偏置为: 0.778358 第298次优化后的参数,权重为: 0.711941, 偏置为: 0.778729 第299次优化后的参数,权重为: 0.711625, 偏置为: 0.778881