1. TensorFlow 实现线性回归
1 | import tensorflow as tf |
1.1. tf.Variable的trainable参数
trainable参数决定了变量在训练时,是否能被optimizer更新。默认值为True
这里我们使用的optimizer是GradientDescentOptimizer,也就是説,在递降下降优化时,如果变量的trainable设置为False,则不会更新该变量
修改程序,设置bias变量的trainable为False。weight不修改,trainable默认为True1
2
3
4
5
6
7
8
9
10
11weight = tf.Variable(tf.random_normal([1, 1], mean=0.0, stddev=1.0), name="w")
bias = tf.Variable(0.0, name="b", trainable=False)
"""
训练优化时,可以看到weight在更新,但是bias就不会被更新
随机初始化的参数权重为:0.108960, 偏置为:0.000000
第1次优化的参数权重为:0.790025, 偏置为:0.000000
第2次优化的参数权重为:1.016438, 偏置为:0.000000
第3次优化的参数权重为:1.079658, 偏置为:0.000000
第4次优化的参数权重为:1.091300, 偏置为:0.000000
"""
反一下,将weight的trainable设置为False1
2
3
4
5
6
7
8
9
10
11weight = tf.Variable(tf.random_normal([1, 1], mean=0.0, stddev=1.0), name="w", trainable=False)
bias = tf.Variable(0.0, name="b")
"""
训练优化时,可以看到weight不更新,bias在更新
随机初始化的参数权重为:-0.799985, 偏置为:0.000000
第1次优化的参数权重为:-0.799985, 偏置为:0.668632
第2次优化的参数权重为:-0.799985, 偏置为:1.230450
第3次优化的参数权重为:-0.799985, 偏置为:1.676977
第4次优化的参数权重为:-0.799985, 偏置为:2.022964
"""
1.2. 学习率的设置
学习率一般都是设置为纯小数,0.1、0.01、0.05、0.0001都是比较常见的,不同场景取值不一定相同
尝试将学习率设置为1.01
2
3
4
5
6
7
8train_op = tf.train.GradientDescentOptimizer(1.0).minimize(loss)
"""
学习率过大,导致无法收敛
第44次优化的参数权重为:-inf, 偏置为:-258865874387307336192779716312766087168.000000
第45次优化的参数权重为:nan, 偏置为:inf
第46次优化的参数权重为:nan, 偏置为:nan
第47次优化的参数权重为:nan, 偏置为:nan
"""
尝试将学习率设置为0.51
2
3
4
5
6
7
8train_op = tf.train.GradientDescentOptimizer(0.5).minimize(loss)
"""
学习率过大,无法收敛
第73次优化的参数权重为:25116022189550720086865452449868546048.000000, 偏置为:14163305502976779258935682315874992128.000000
第74次优化的参数权重为:-74728367966826988948298285007438348288.000000, 偏置为:-42178556168502280071211426706320523264.000000
第75次优化的参数权重为:inf, 偏置为:inf
第76次优化的参数权重为:nan, 偏置为:nan
"""
尝试将学习率设置为0.31
2
3
4
5
6
7
8
9
10train_op = tf.train.GradientDescentOptimizer(0.3).minimize(loss)
"""
学习率过大,无法收敛
第199次优化的参数权重为:27622535044875995800150868730826457088.000000, 偏置为:14452844505972508223613938308202102784.000000
第200次优化的参数权重为:-38350900392920344132144949338126155776.000000, 偏置为:-21995243882872851252496778696681586688.000000
第201次优化的参数权重为:59621299127281493356407110148567334912.000000, 偏置为:31287847878689103312685269306321141760.000000
第202次优化的参数权重为:-inf, 偏置为:-51636013054275812452146957581006405632.000000
第203次优化的参数权重为:nan, 偏置为:inf
第204次优化的参数权重为:nan, 偏置为:nan
"""
尝试将学习率设置为0.21
2
3
4
5
6
7
8train_op = tf.train.GradientDescentOptimizer(0.2).minimize(loss)
"""
差不多训练500多次,就达到目标值
第542次优化的参数权重为:0.700000, 偏置为:0.799999
第543次优化的参数权重为:0.700000, 偏置为:0.799999
第544次优化的参数权重为:0.700000, 偏置为:0.800000
第545次优化的参数权重为:0.700000, 偏置为:0.800000
"""
尝试将学习率设置为0.11
2
3
4
5
6
7
8
9
10
11
12
13
14train_op = tf.train.GradientDescentOptimizer(0.1).minimize(loss)
"""
差不多训练1000多次,近似达到目标值
第1005次优化的参数权重为:0.700001, 偏置为:0.799998
第1006次优化的参数权重为:0.700001, 偏置为:0.799998
第1007次优化的参数权重为:0.700001, 偏置为:0.799999
第1008次优化的参数权重为:0.700001, 偏置为:0.799999
......
第4996次优化的参数权重为:0.700000, 偏置为:0.799999
第4997次优化的参数权重为:0.700000, 偏置为:0.799999
第4998次优化的参数权重为:0.700000, 偏置为:0.799999
第4999次优化的参数权重为:0.700000, 偏置为:0.799999
第5000次优化的参数权重为:0.700000, 偏置为:0.799999
"""
1.3. tf.variable_scope设置变量作用域
tf.variable_scope() 设置变量作用域,本来的作用是结合tf.get_variable()实现变量的共享。但是这里使用tf.variable_scope,主要目的是为了使程序结构更加清晰。而且使用TensorBoard查看时,图的结构也更加清晰
2. 线性回归可视化
2.1. 增加可视化功能
在程序中添加tf.summary.FileWriter,将图序列化到事件文件1
2
3with tf.Session() as sess:
# 序列化生成事件文件
filewriter = tf.summary.FileWriter("summary", graph=sess.graph)
启动TensorBoard1
tensorboard --logdir summary
2.2. 添加数据的显示
1 | # tf.summary.scalar添加标量统计结果 |
3. 保存与加载模型
假设训练要非常久,有时候训练到一半宕机了,下一次必须从头开始训练,这样前面的工作都白费了。
我们可以每训练一定次数,就把weight和bias序列化到文件中。下一次读取weight和bias的值,作为初始值进行训练即可
下面设置模型的保存1
2
3
4
5
6
7
8
9# 定义一个保存模型的实例
saver = tf.train.Saver()
with tf.Session() as sess:
for i in range(max_step):
# ......
# 训练结束后保存模型,将模型保存到model目录下
saver.save(sess, "model/linear_regression_model")
保存模型之后,在model目录可以看到1
2
3
4
5model
|--checkpoint
|--linear_regression_model.data-00000-of-00001
|--linear_regression_model.index
|--linear_regression_model.meta
设置加载模型1
2
3
4
5
6
7
8
9
10
11
12
13
14# 定义一个保存模型的实例
saver = tf.train.Saver()
with tf.Session() as sess:
# 开始训练之前,先加载模型,覆盖模型当中随机定义的参数,从上次训练的参数结果开始
# 如果存在model/checkpoint,说明之前已经保存过模型,才加载
if os.path.exists("model/checkpoint"):
saver.restore(sess, "model/linear_regression_model")
for i in range(max_step):
# ......
# 训练结束后保存模型,将模型保存到model目录下
saver.save(sess, "model/linear_regression_model")
4. 自定义命令行参数
1 | """ |
用命令行执行该py文件1
python tf_linear_regression.py --max_step=200 --model_dir="model/linear_regression_model"
5. 最终代码
1 | import tensorflow as tf |