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


由此可见学习率的调整是非常重要的

posted @ 2021-01-19 20:21  Nevesettle  阅读(69)  评论(0编辑  收藏  举报