zoukankan      html  css  js  c++  java
  • 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
    
    
    

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

  • 相关阅读:
    tctip demo页面>
    tctip demo页面>
    tctip demo页面>
    tctip demo页面>
    tctip demo页面>
    tctip demo页面>
    关于值类型与列类型不匹配,所需类型是 DataRow"的解决方案
    如何给excel设置密码
    Excel如何将大写字符转化为小写
    C#调用WebService(服务引用-xml)
  • 原文地址:https://www.cnblogs.com/wuren-best/p/14299814.html
Copyright © 2011-2022 走看看