前提
- 变量:
变量
- 变量的创建
- 变量的初始化
- 变量的作用域
定义:变量也是一种op,能够被存储持久化,他的值就是张量,默认被训练
变量op
1.变量的初始化:变量的初始化必须在模型的其它操作运行之前先明确地完成。
# 变量的创建tf.Variable
var = tf.Variable(tf.random_normal([2, 3], mean=0.0, stddev=1.0))
# 必须做一步显示的初始化op
init_op = tf.global_variables_initializer()
with tf.Session() as sess:
print(sess.run(var))
tensorflow.python.framework.errors_impl.FailedPreconditionError: Attempting to use uninitialized value Variable
此时会发现报错,问题出现在,任何op都得在绘画中画出来,所以得在with中写上init_op
with tf.Session() as sess:
sess.run(init_op)
print(sess.run(var))
变量可视化
# 把程序的图结构写入事件文件,graph:把指定的图放到文件中去
filewriter = tf.summary.FileWriter('./summer/test', graph=sess.graph)
# 这里注意----多一个/---意义是让她去里面找
# 在命令行做事
tensorboard --logdir='./summer/test/'
tensorfrom—实现线性回归
前提准备
- 准备好1特征值和目标值
- 建立模型,随机初始化准备一个权重w,和一个偏量b
- 求损失函数,误差 loss均方误差
- 梯度下降去优化损失过程,指定学习率
api
(m,n)(m个样本,n个特征)
- 矩阵运算
tf.matmul(x,w) - 平方
tf.square(error) - 均值
tf.reduct_mean(error) - 梯度下降api
tf.train.GradientDescentOptimzer(learning_rate)
learning_rate—学习率
下面我们就用手写来,写一个线性回归
import tensorflow as tf
def lien():
"""
自实现线性回归
"""
# 1.准备数据,x[100,10]--100个样本 1个特征 ,y[100] ----目标值100
x = tf.random_normal([100, 1], mean=1.75, stddev=0.5, name='x_dota')
# 矩阵乘法必须是2维的
y_true = tf.matmul(x, [[0.7]])+0.8
# 2.建立线性回归模型,1.个特征,1个权重,1个偏置 y = wx + b
# 随机给一个权重和偏置,让他去计算损失,然后在优化
# 用变量定义才能优化
weight = tf.Variable(tf.random_normal([1, 1], mean=0.0, stddev=1.0), name='w')
bias = tf.Variable(0.0, name='0')
y_predict = tf.matmul(x, weight) + bias
# 建立损失函数,均方误差
loss = tf.reduce_mean(tf.square(y_true - y_predict))
# 梯度下降优化损失 leaning_rate,???
train_op = tf.train.GradientDescentOptimizer(0.1).minimize(loss)
init_op = tf.global_variables_initializer()
# 通过绘画运行程序
with tf.Session() as sess:
# 初始化变量
sess.run(init_op)
# 打印随机初始化
print('随机初始化的参数权重为:%f,偏置为:%f'%(weight.eval(), bias.eval()))
# # 运行优化
# sess.run(train_op)
# print('优化参数权重为:%f,偏置为:%f' % (weight.eval(), bias.eval()))
# 循环训练 运行优化
for i in range(100):
sess.run(train_op)
print('第%d次优化参数权重为:%f,偏置为:%f' % (i, weight.eval(), bias.eval()))
return None
if __name__ == "__main__":
lien()
作用域-tensorfrom–作用域
with tf.variable_scope('youhua'):
增加变量显示
目的:观察模型参数、损失值等变量的变化
1.收集变量
tf.summary.scalar('losses', loss) # 收集损失函数和准确率等单值变量
tf.summary.histogram('weights',weight) # 收集高纬的变量参数
2.合并变量写入事件文件
merged = tf.summary.merge_all()
# 运行合并的tensor
summery = sess.run(merged)
# 添加
filerwrite.add_summary(summery, i )
改进后:
import tensorflow as tf
def lien():
"""
自实现线性回归
"""
with tf.variable_scope('dota'):
# 1.准备数据,x[100,10]--100个样本 1个特征 ,y[100] ----目标值100
x = tf.random_normal([100, 1], mean=1.75, stddev=0.5, name='x_dota')
# 矩阵乘法必须是2维的
y_true = tf.matmul(x, [[0.7]])+0.8
with tf.variable_scope('modle'):
# 2.建立线性回归模型,1.个特征,1个权重,1个偏置 y = wx + b
# 随机给一个权重和偏置,让他去计算损失,然后在优化
# 用变量定义才能优化
weight = tf.Variable(tf.random_normal([1, 1], mean=0.0, stddev=1.0), name='w')
bias = tf.Variable(0.0, name='0')
y_predict = tf.matmul(x, weight) + bias
with tf.variable_scope('loss'):
# 建立损失函数,均方误差
loss = tf.reduce_mean(tf.square(y_true - y_predict))
with tf.variable_scope('youhua'):
# 梯度下降优化损失 leaning_rate,???
train_op = tf.train.GradientDescentOptimizer(0.1).minimize(loss)
init_op = tf.global_variables_initializer()
# 通过绘画运行程序
# 1.收集tensor
tf.summary.scalar('losses', loss) # 收集损失函数和准确率等单值变量
tf.summary.histogram('weights',weight) # 收集高纬的变量参数
# 2.合并变量,写入事件文件
merged = tf.summary.merge_all()
with tf.Session() as sess:
# 初始化变量
sess.run(init_op)
# 打印随机初始化
print('随机初始化的参数权重为:%f,偏置为:%f'%(weight.eval(), bias.eval()))
# # 运行优化
# sess.run(train_op)
# print('优化参数权重为:%f,偏置为:%f' % (weight.eval(), bias.eval()))
# 建立事件文件
filerwrite = tf.summary.FileWriter('./summer/test/',graph=sess.graph)
# 循环训练 运行优化
for i in range(100):
sess.run(train_op)
# 运行合并的tensor
summery = sess.run(merged)
# 添加,每次迭代都要写i
filerwrite.add_summary(summery, i)
print('第%d次优化参数权重为:%f,偏置为:%f' % (i, weight.eval(), bias.eval()))
return None
if __name__ == "__main__":
lien()
模型的加载和保存
# 保存模型
saver.save(sess, './summer/model ')
# 加载模型,覆盖模型,从上次训练的参数开始
if os.path.exists('./summer/checkpoint'):
saver.restore(sess, './summer/model ')
今日总结
import os
import tensorflow as tf
def lien():
"""
自实现线性回归
"""
with tf.variable_scope('dota'):
# 1.准备数据,x[100,10]--100个样本 1个特征 ,y[100] ----目标值100
x = tf.random_normal([100, 1], mean=1.75, stddev=0.5, name='x_dota')
# 矩阵乘法必须是2维的
y_true = tf.matmul(x, [[0.7]])+0.8
with tf.variable_scope('modle'):
# 2.建立线性回归模型,1.个特征,1个权重,1个偏置 y = wx + b
# 随机给一个权重和偏置,让他去计算损失,然后在优化
# 用变量定义才能优化
weight = tf.Variable(tf.random_normal([1, 1], mean=0.0, stddev=1.0), name='w')
bias = tf.Variable(0.0, name='0')
y_predict = tf.matmul(x, weight) + bias
with tf.variable_scope('loss'):
# 建立损失函数,均方误差
loss = tf.reduce_mean(tf.square(y_true - y_predict))
with tf.variable_scope('youhua'):
# 梯度下降优化损失 leaning_rate,???
train_op = tf.train.GradientDescentOptimizer(0.1).minimize(loss)
init_op = tf.global_variables_initializer()
# 通过绘画运行程序
# 1.收集tensor
tf.summary.scalar('losses', loss) # 收集损失函数和准确率等单值变量
tf.summary.histogram('weights',weight) # 收集高纬的变量参数
# 2.合并变量,写入事件文件
merged = tf.summary.merge_all()
# 定义一个保存模型的实例
saver = tf.train.Saver()
with tf.Session() as sess:
# 初始化变量
sess.run(init_op)
# 打印随机初始化
print('随机初始化的参数权重为:%f,偏置为:%f'%(weight.eval(), bias.eval()))
# # 运行优化
# sess.run(train_op)
# print('优化参数权重为:%f,偏置为:%f' % (weight.eval(), bias.eval()))
# 建立事件文件
filerwrite = tf.summary.FileWriter('./summer/test/',graph=sess.graph)
# 加载模型,覆盖模型,从上次训练的参数开始
if os.path.exists('./summer/checkpoint'):
saver.restore(sess, './summer/model ')
# 循环训练 运行优化
for i in range(500):
sess.run(train_op)
# 运行合并的tensor
summery = sess.run(merged)
# 添加,每次迭代都要写i
filerwrite.add_summary(summery, i)
print('第%d次优化参数权重为:%f,偏置为:%f' % (i, weight.eval(), bias.eval()))
saver.save(sess, './summer/model ')
return None
if __name__ == "__main__":
lien()