案例实现步骤:
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")
查看是否生效: