TensorFlow学习笔记(二)---TensorFlow实现一个简单的线性回归案例

案例实现步骤:

    1.准备好1特征和1目标值(y = x*0.7 + 0.8)
    2.建立模型,准备一个权重w,一个偏置b(随机初始化) y_predict = xw+b(模型的参数必须用变量定义)
    3.求损失函数,均方误差((y1-y1’)2+…+(y_100-y_100’)2)/100
    4.梯度下降优化损失的过程,指定学习率
TensorFlow运算API:
    矩阵运算:tf.matmul(x,w)
    平方: tf.square(error)
    均值: tf.reduce_mean(error)
梯度下降API:
    梯度下降优化器:tf.train.GradientDescentOptimzer(learning_rate)
        .learning_rate:学习率
        .minamize(loss):最小优化损失
        return : 梯度下降op
关于梯度爆炸/梯度消失
    在极端情况下,权重的值变得非常大,以至于溢出,导致NaN值
    如何解决梯度爆炸问题(深度神经网络(如RNN)当中更容易出现)
    1,重新设计网络
    2,调整学习率
    3,使用梯度截断(在训练过程中检查和限制梯度的大小)
    4,使用激活函数

# -*- coding: utf-8 -*-
'''
@Author :Jason
'''
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()

#训练参数:trainable参数:指定这个变量能跟这梯度下降一起优化
#
def myregression():
    '''
    自实现一个线性回归预测
    :return:None
    '''

    #1.准备数据:x 特征值 100行 1列 y 目标值 100列 1行
    x = tf.random_normal([100,1],mean=1.75,stddev=0.5,name="x_data")

    #矩阵相乘必须是二维的
    y_true = tf.matmul(x,[[0.7]]) + 0.8

    #2.建立线性回归模型 1个特征,1个权重 一个偏重 y = x w + b
    # 随机给一个权重和偏重的值,让其计算损失,然后在当前状态下优化
    #用变量定义才能优化
    #trainable参数:指定这个变量能跟这梯度下降一起优化
    weight = tf.Variable(tf.random_normal([1,1],mean=0.0,stddev=1.0),name="w")
    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))

    #4.梯度下降优化损失 learning_rate:0~1
    train_op = tf.train.GradientDescentOptimizer(0.1).minimize(loss)

    #定义一个初始化变量的op
    init_op = tf.global_variables_initializer()

    #通过会话运行程序
    with tf.Session() as sess:
        #初始化变量
        sess.run(init_op)
        #随机最先初始化的权重 和 偏重
        print("随机初始化的参数权重为:{},偏重为:{}".format(weight.eval(),bias.eval()))#随机初始化的参数权重为:[[-2.2545907]],偏重为:0.0

        #建立事件文件
        filewriter = tf.summary.FileWriter("./tmp/summary/test",graph=sess.graph)

        #循环训练,运行优化
        for i in range(50):#数据随机,所以这里的训练次数不一定
            sess.run(train_op)
            print("第{}次优化的参数权重为:{},偏重为:{}".format(i,weight.eval(), bias.eval()))
    return None

if __name__ == "__main__":
    myregression()

 

查看可视化结果:

                     

tensorflow变量作用域
    tf.variable_socpe(<socpe_name>)创建指定名字的变量的作用域
    观察变量的name改变
    嵌套使用变量作用域
    观察变量的name改变

对上面的代码加上变量作用域:

# -*- coding: utf-8 -*-
'''
@Author :Jason
'''
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()

#1.训练参数:trainable参数:指定这个变量能跟这梯度下降一起优化
#学习率和步数的设置

#2.添加权重参数、损失值等在tensorboard观察的情况
def myregression():
    '''
    自实现一个线性回归预测
    :return:None
    '''
    with tf.variable_scope("data"):
        #1.准备数据:x 特征值 100行 1列 y 目标值 100列 1行
        x = tf.random_normal([100,1],mean=1.75,stddev=0.5,name="x_data")

        #矩阵相乘必须是二维的
        y_true = tf.matmul(x,[[0.7]]) + 0.8
    with tf.variable_scope("model"):
        #2.建立线性回归模型 1个特征,1个权重 一个偏重 y = x w + b
        # 随机给一个权重和偏重的值,让其计算损失,然后在当前状态下优化
        #用变量定义才能优化
        #trainable参数:指定这个变量能跟这梯度下降一起优化
        weight = tf.Variable(tf.random_normal([1,1],mean=0.0,stddev=1.0),name="w")
        bias = tf.Variable(0.0,name="b")

        y_predict = tf.matmul(x,weight) + bias

    with tf.variable_scope("loss"):#减少损失
        #3.建立损失函数,均方误差
        loss = tf.reduce_mean(tf.square(y_true - y_predict))

    with tf.variable_scope("optimizer"):#优化
        #4.梯度下降优化损失 learning_rate:0~1
        train_op = tf.train.GradientDescentOptimizer(0.1).minimize(loss)

    #定义一个初始化变量的op
    init_op = tf.global_variables_initializer()

    #通过会话运行程序
    with tf.Session() as sess:
        #初始化变量
        sess.run(init_op)
        #随机最先初始化的权重 和 偏重
        print("随机初始化的参数权重为:{},偏重为:{}".format(weight.eval(),bias.eval()))#随机初始化的参数权重为:[[-2.2545907]],偏重为:0.0

        #建立事件文件
        filewriter = tf.summary.FileWriter("./tmp/summary/test",graph=sess.graph)

        #循环训练,运行优化
        for i in range(50):#数据随机,所以这里的训练次数不一定
            sess.run(train_op)
            print("第{}次优化的参数权重为:{},偏重为:{}".format(i,weight.eval(), bias.eval()))
    return None

if __name__ == "__main__":

    myregression()

再次查看可视化结果:

                               


模型保存和加载
  tf.train.Saver(var_list=None,max_to_keep=5)
    var_list:指定将要保存和还原的变量。它可以作为一个dict或一个列表传递
    max_to_keep:指示要保留的最近检查点文件的最大数量。创建新文件时,会删除较旧的文件。如果无或0,则保留所有检查点文件,默认为5(即保留最新的5个检查点文件。)
例如:saver.save(sess,"/tmp/ckpt/test/model")
    saver.restore(sess,"/tmp/ckpt/test/model")
保存文件格式:checkpoint文件

模型的加载:

#加载模型,覆盖模型中随机定义的参数,从上次训练的参数结果开始
        if os.path.exists("./tmp/ckpt/checkpoint"):
            saver.restore(sess,"./tmp/ckpt/random_name")

模型的保存:

#模型保存
        saver.save(sess,"./tmp/ckpt/random_name")

 查看是否生效:

 

发布了128 篇原创文章 · 获赞 95 · 访问量 35万+

猜你喜欢

转载自blog.csdn.net/qq_36853469/article/details/103640140
今日推荐