tensorflow:实现一个线性回归案例

Tensorflow线性回归

开发流程:
1.准备好相关数据的 特征值和目标值
2.建立模型,随机初始化准备一个权重w,一个偏置b,模型的参数必须用变量去命名
3.求损失函数,还有相关的均方误差
4.梯度下降去优化损失过程 指定学习率

Tensorflow运算API

矩阵运算
tf.matmul(x, w)

平方
tf.square(error)

均值
tf.reduce_mean(error)

梯度下降API

tf.train.GradientDescentOptimizer(learning_rate)
梯度下降优化
learning_rate:学习率,一般为

method:

return:梯度下降op

代码优化
import tensorflow as tf
import os
os.environ['TF_CPP_MIN_LOG_LEVEL']='2'


def  myregression():
    """自实现一个线性回归预测"""
    #1.准备数据 x特征值【100,10]100个样本10个特征,目标值y【100】
    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个权重,1个偏置 y=wx+b
    #随机给一个权重和偏置的值计算损失,然后在当前状态下进行优化
    #用变量定义才能优化
    #trainable 参数:指定这个变量能否跟着梯度下降一起优化 默认为TRUE
    weight=tf.Variable(tf.random_normal([1,1],mean=0.0,stddev=1.0,name="w"),trainable=True)
    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 ,2,3,5,7,10

    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("随机初始化的参数权重为:%f,偏置为 %f" %(weight.eval(),bias.eval()))

        # 循环训练 运行优化
        for i in range(200):

            sess.run(train_op)
            print("第%d次优化的参数权重为:%f,偏置为 %f" % (i,weight.eval(), bias.eval()))

    return None
if __name__ == '__main__':
    myregression()

在这里插入图片描述
学习率和步数的设置:

学习率不能给太高,一般是0.01或者更小。如果将前面代码0.1改为0.3

train_op=tf.train.GradientDescentOptimizer(0.3).minimize(loss)

在这里插入图片描述发现梯度爆炸/梯度消失

梯度爆炸:

在极端情况下权重的值变得非常的大,以至于溢出,导致NaN值。

如何解决梯度爆炸问题(深度神经网络(如RNN)当中更容易出现)
1.重新设计网络
2.调整学习率
3.使用梯度截断(在训练过程中检查和限制梯度的大小)
4.使用激活函数

Tensorflow变量作用域

tf.variable_scope(<scope_name>)创建指定名字的变量作用域,让代码更加的清晰。

没有使用作用域时逻辑图:
在这里插入图片描述
使用作用域后:

 with tf.variable_scope("data"):

        #1.准备数据 x特征值【100,10]100个样本10个特征,目标值y【100】
        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个权重,1个偏置 y=wx+b
        #随机给一个权重和偏置的值计算损失,然后在当前状态下进行优化
        #用变量定义才能优化
        #trainable 参数:指定这个变量能否跟着梯度下降一起优化
        weight=tf.Variable(tf.random_normal([1,1],mean=0.0,stddev=1.0),trainable=True,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 ,2,3,5,7,10

        train_op=tf.train.GradientDescentOptimizer(0.1).minimize(loss)

在这里插入图片描述

增加变量显示

目的:观察模型的参数、损失值等变量值的变化

1、收集变量
tf.summary.scalar(name=’’,tensor) 收集对于损失函数和准确率
等单值变量,name为变量的名字,tensor为值
tf.summary.histogram(name=‘’,tensor) 收集高维度的变量参数
tf.summary.image(name=‘’,tensor) 收集输入的图片张量能显示图片

2、合并变量写入事件文件
merged = tf.summary.merge_all()
运行合并:summary = sess.run(merged),每次迭代都需运行
添加:FileWriter.add_summary(summary,i),i表示第几次的值

    #收集tensor
    tf.summary.scalar("losses",loss)
    tf.summary.histogram("weight",weight)
  	#定义合并tensor的op
    merged=tf.summary.merge_all()
    #在损失循环中
    #运行合并的tensor
            summary=sess.run(merged)
            filewriter.add_summary(summary,i)

在这里插入图片描述

模型的保存和加载

如果当模型训练了几千次,突然电脑宕机了,不可能重新开始训练,这时候我们需要模型的保存和加载,保存训练的相关的模型,提高突发事件中的效率。

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

例如:saver.save(sess, ‘/tmp/ckpt/test/model’)
saver.restore(sess, ‘/tmp/ckpt/test/model’)
保存文件格式:checkpoint文件

 #定义一个保存模型的实例
    saver=tf.train.Saver()
#保存模型
saver.save(sess,"./ckpt/model")
#加载模型,覆盖模型当中随机定义的参数,从上次训练的参数结果开始
        if os.path.exists("./ckpt/checkpoint"):
            saver.restore(sess,"./ckpt/model")
自定义命令行参数

1.在这里插入图片描述
2、 tf.app.flags.,在flags有一个FLAGS标志,它在程序中可以调用到我们
前面具体定义的flag_name

3、通过tf.app.run()启动main(argv)函数

在这里插入图片描述

总结:

import tensorflow as tf
import os
os.environ['TF_CPP_MIN_LOG_LEVEL']='2'


#添加权重参数,损失值等在Tensorboard观察情况 1.收集变量  2.合并变量写入事件文件

#定义命令行参数
#1.首先定义有哪些参数需要在运行的时候指定
#2.程序当中获取定义命令行参数
#第一个参数 : 名字,默认值 ,说明

# tf.app.flags.DEFINE_integer("max_step",100,"模型训练的步数")
# tf.app.flags.DEFINE_string("model_dir","","模型加载的路径")
#定义获取命令行参数名字
# FLAGS=tf.app.flags.FLAGS
def  myregression():
    """自实现一个线性回归预测"""
    with tf.variable_scope("data"):

        #1.准备数据 x特征值【100,10]100个样本10个特征,目标值y【100】
        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个权重,1个偏置 y=wx+b
        #随机给一个权重和偏置的值计算损失,然后在当前状态下进行优化
        #用变量定义才能优化
        #trainable 参数:指定这个变量能否跟着梯度下降一起优化
        weight=tf.Variable(tf.random_normal([1,1],mean=0.0,stddev=1.0),trainable=True,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 ,2,3,5,7,10

        train_op=tf.train.GradientDescentOptimizer(0.01).minimize(loss)
    #收集tensor
    tf.summary.scalar("losses",loss)
    tf.summary.histogram("weight",weight)

    #定义合并tensor的op
    merged=tf.summary.merge_all()

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

    #定义一个保存模型的实例
    saver=tf.train.Saver()
    #通过会话运行程序
    with  tf.Session()  as sess:
        #初始化变量
        sess.run(init_op)
        #打印随机最先初始化的权重和偏置
        print("随机初始化的参数权重为:%f,偏置为 %f" %(weight.eval(),bias.eval()))
        #建立事件文件
        filewriter=tf.summary.FileWriter("./summary/",graph=sess.graph)
        #加载模型,覆盖模型当中随机定义的参数,从上次训练的参数结果开始
        if os.path.exists("./ckpt/checkpoint"):
            #saver.restore(sess,FLAGS.model_dir)
            saver.restore(sess,"./ckpt/model")
        # 循环训练 运行优化
        for i in range(500):
            #运行合并的tensor
            summary=sess.run(merged)
            filewriter.add_summary(summary,i)

            sess.run(train_op)
            print("第%d次优化的参数权重为:%f,偏置为 %f" % (i,weight.eval(), bias.eval()))
        #模型的保存
        # saver.save(sess,FLAGS.model_dir)
        saver.save(sess,"./ckpt/model")

    return None
if __name__ == '__main__':
    myregression()
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值