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()