day11-TensorFlow自主实现简单的线性回归
过程及解释在代码中
# coding=utf-8
import tensorflow as tf
def ownregession():
"""
自主实现线性回归
:return:
"""
# 1、模拟数据
# 模拟一百条数据,特征值为一个
x = tf.random_normal([100,1],mean=1.65,stddev=1.0,name="x")
# 假定权重为1.5,偏执为0.6
# 注意是矩阵的相乘,所以必须是二维的,即 100*1 乘 1*1 矩阵
y_true = tf.matmul(x,[[1.5]]) + 0.6
# 2、构建随机的权重和偏执
# 权重为一个,由于矩阵运算所以注意要构造成矩阵
# 由于权重和偏执是需要实时计算更改的,所以必须定义为变量
weight = tf.Variable(tf.random_normal([1,1],mean=0.0,stddev=1.0))
bles = tf.Variable(0.0)
# 3、构建模型
y_predict = tf.matmul(x,weight) + bles
# 4、梯度下降训练
# 根据均方误差得出损失值
less = tf.reduce_mean(tf.square(y_true - y_predict))
# 梯度下降训练
train_op = tf.train.GradientDescentOptimizer(learning_rate=0.2).minimize(less)
# 5、开启会话并训练
# 定义一个初始化变量的操作
init_op = tf.global_variables_initializer()
# 开启会话
with tf.Session() as sess:
# 变量初始化
sess.run(init_op)
print("随机初始化的权重为:%f,偏执为:%f" % (weight.eval(),bles.eval()))
for i in range(110):
sess.run(train_op)
print("第%d次训练的权重为:%f,偏执为:%f" % ((i+1),weight.eval(), bles.eval()))
return None
if __name__ == '__main__':
ownregession()
需要注意的是,梯度下降的学习率这个参数很重要,刚开始时学习率使用的是0.5,效果如下:
随机初始化的权重为:-1.176836,偏执为:0.000000
第1次训练的权重为:11.774900,偏执为:5.532479
第2次训练的权重为:-28.698801,偏执为:-14.754520
第3次训练的权重为:83.260292,偏执为:43.535122
第4次训练的权重为:-357.450165,偏执为:-149.433136
第5次训练的权重为:1256.492065,偏执为:617.058716
第6次训练的权重为:-3790.827637,偏执为:-1936.139038
第7次训练的权重为:13885.773438,偏执为:6341.460449
第8次训练的权重为:-44431.449219,偏执为:-22852.242188
第9次训练的权重为:185672.609375,偏执为:78590.914062
第10次训练的权重为:-481110.437500,偏执为:-261884.406250
第11次训练的权重为:1522079.250000,偏执为:698291.000000
第12次训练的权重为:-6503222.000000,偏执为:-2763017.000000
第13次训练的权重为:22644020.000000,偏执为:11137773.000000
第14次训练的权重为:-78675488.000000,偏执为:-36981220.000000
第15次训练的权重为:316556960.000000,偏执为:137661856.000000
第16次训练的权重为:-1192176512.000000,偏执为:-555345792.000000
...
第101次训练的权重为:nan,偏执为:nan
第102次训练的权重为:nan,偏执为:nan
第103次训练的权重为:nan,偏执为:nan
第104次训练的权重为:nan,偏执为:nan
第105次训练的权重为:nan,偏执为:nan
第106次训练的权重为:nan,偏执为:nan
第107次训练的权重为:nan,偏执为:nan
第108次训练的权重为:nan,偏执为:nan
第109次训练的权重为:nan,偏执为:nan
第110次训练的权重为:nan,偏执为:nan
最初以为是自己哪里操作失误了,后来想起来学习率这一参数,更改为现在的0.2发现效果最好,效果为:
随机初始化的权重为:-1.345755,偏执为:0.000000
第1次训练的权重为:2.966045,偏执为:2.055976
第2次训练的权重为:-0.476985,偏执为:0.429577
第3次训练的权重为:2.951299,偏执为:1.858248
第4次训练的权重为:-0.163608,偏执为:0.356180
第5次训练的权重为:2.339736,偏执为:1.498997
第6次训练的权重为:0.324650,偏执为:0.550198
第7次训练的权重为:1.958994,偏执为:1.279938
第8次训练的权重为:0.743843,偏执为:0.696780
...
第101次训练的权重为:1.499966,偏执为:0.600077
第102次训练的权重为:1.499962,偏执为:0.600067
第103次训练的权重为:1.499975,偏执为:0.600066
第104次训练的权重为:1.499968,偏执为:0.600055
第105次训练的权重为:1.499980,偏执为:0.600054
第106次训练的权重为:1.499973,偏执为:0.600046
第107次训练的权重为:1.499984,偏执为:0.600046
第108次训练的权重为:1.499976,偏执为:0.600038
第109次训练的权重为:1.499985,偏执为:0.600038
第110次训练的权重为:1.499983,偏执为:0.600032
由此可见学习率的调整是非常重要的