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
        

posted on 2019-11-15 09:54  Luaser  阅读(328)  评论(0编辑  收藏  举报