P53 trainable 学习率的调整,梯度爆炸

 

import tensorflow as tf
def myregession():
    """
    自实现一个线性回归预测
    :return: None
    """
    #1. 准备数据 x 特征值,[100,1],  100个样本,1个特征
    #           y 目标值 ,[100]
    x=tf.random_normal([10,1],mean=1.75,stddev=0.5,name="x_data")#这个是真实的特征值
    y_true= tf.matmul(x,[[0.7]])+0.8  #先假设已经知道这个线性关系,其实现实中是不知道的,为了准备准据,才这样假设的
    #注:矩阵相乘必须是二维的
    # 2. 建立线性回归模型,一个特征,1个权重,一个偏置,y=wx+b
    #w,b需要随机初始化一个值,从这个地方开始优化,从这个地方计算损失,然后在当前状态下优化
    #trainable参数是指定这个变量能否跟着梯度下降一起优化
    
    weight= tf.Variable(tf.random_normal([1,1],mean=0.0,stddev=1.0),name="w",trainable=False)
    #权重必须定义成tf的变量,因为只有用变量定义才能优化,必须是二维的,所以定义成1行1列
    bias=tf.Variable(0.0,name='b')
    y_predict=tf.matmul(x,weight)+bias
    # 3. 建立损失函数,求均方误差
    loss=tf.reduce_mean(tf.square(y_true-y_predict))
    # 3. 梯度下降优化损失,learning_rate:0~1,2,3,5,7,10
    train_op=tf.train.ProximalGradientDescentOptimizer(0.1).minimize(loss)
    #定义个一个初始化变量的 op
    init_op=tf.global_variables_initializer()
    #通过会话运行程序
    with tf.Session() as sess:
        # 初始化变量
        sess.run(init_op)

        #打印最先随机初始化的权重和偏置
        print("随机初始化的参数,权重为:%f,偏置为:%f"%(weight.eval(),bias.eval()))
        #注:weight,bias是不能直接打印的,因为它们是op
        # 运行优化

        #循环训练,持续优化
        for i in range(300):
            sess.run(train_op)
            print("第%d次运行优化后的参数,权重为:%f,偏置为:%f" % (i,weight.eval(), bias.eval()))

    return None

if __name__=="__main__":
    myregession()

运行结果:

随机初始化的参数,权重为:0.923550,偏置为:0.000000
第0次运行优化后的参数,权重为:0.923550,偏置为:0.067194
第1次运行优化后的参数,权重为:0.923550,偏置为:0.135915
第2次运行优化后的参数,权重为:0.923550,偏置为:0.186926
第3次运行优化后的参数,权重为:0.923550,偏置为:0.225835
第4次运行优化后的参数,权重为:0.923550,偏置为:0.257090
第5次运行优化后的参数,权重为:0.923550,偏置为:0.287806
第6次运行优化后的参数,权重为:0.923550,偏置为:0.299400
第7次运行优化后的参数,权重为:0.923550,偏置为:0.315512
第8次运行优化后的参数,权重为:0.923550,偏置为:0.341794
第9次运行优化后的参数,权重为:0.923550,偏置为:0.345407
第10次运行优化后的参数,权重为:0.923550,偏置为:0.358482
第11次运行优化后的参数,权重为:0.923550,偏置为:0.369397
第12次运行优化后的参数,权重为:0.923550,偏置为:0.372021
第13次运行优化后的参数,权重为:0.923550,偏置为:0.399361
第14次运行优化后的参数,权重为:0.923550,偏置为:0.394093
第15次运行优化后的参数,权重为:0.923550,偏置为:0.399880
第16次运行优化后的参数,权重为:0.923550,偏置为:0.398234
第17次运行优化后的参数,权重为:0.923550,偏置为:0.399431
第18次运行优化后的参数,权重为:0.923550,偏置为:0.400979
第19次运行优化后的参数,权重为:0.923550,偏置为:0.399697
第20次运行优化后的参数,权重为:0.923550,偏置为:0.405342
第21次运行优化后的参数,权重为:0.923550,偏置为:0.403404
第22次运行优化后的参数,权重为:0.923550,偏置为:0.409384
第23次运行优化后的参数,权重为:0.923550,偏置为:0.421517
...
第296次运行优化后的参数,权重为:0.923550,偏置为:0.397181
第297次运行优化后的参数,权重为:0.923550,偏置为:0.397113
第298次运行优化后的参数,权重为:0.923550,偏置为:0.392938
第299次运行优化后的参数,权重为:0.923550,偏置为:0.405100

Process finished with exit code 0

可见,trainable设为false的时候,weight是没有跟着梯度下降一起优化的。

 

posted on 2020-12-21 16:40  一杯明月  阅读(179)  评论(0编辑  收藏  举报