Python神经网络3之TensorFlow
Python神经网络3之TensorFlowTensorFlow框架介绍变量OP创建变量使用tf.variable_scope()修改变量的命名空间高级API基础API高级API案例:实现线性回归线性回归原理复习实现线性回归的训练APITensorFlow框架介绍变量OPTensorFlow变量是表示程序处理的共享持久状态的最佳方法,变量通过tf.Variable OP类进行操作变量的特点:存储持
·
Python神经网络3之TensorFlow
TensorFlow框架介绍
变量OP
TensorFlow变量是表示程序处理的共享持久状态的最佳方法,变量通过tf.Variable OP类进行操作
变量的特点:
- 存储持久化
- 可修改值
- 可指定被训练
变量可存储模型参数
创建变量
- tf.Variable(initial_value=None,trainable=True,collections=None,name=None)
initial_value:初始化的值
trainable:是否被训练
collections:新变量将添加到列出的图的集合中collections,默认为[GraphKeys.GLOBAL_VARIABLES],如果trainable是True变量也被添加都图形集合GraphKeys.TRAINABLE_VARIABLES - 变量需要显式初始化,才能运行值
def variable_demo01():
#变量的演示
a=tf.Variable(initial_value=50)
b=tf.Variable(initial_value=60)
c=a+b
print("a:\n",a)
print("b:\n",b)
print("c:\n",c)
#初始化变量
init=tf.global_variables_initializer();
with tf.Session() as sess:
#运行初始化
sess.run(init)
a_value,b_value,c_value=sess.run([a,b,c])
print("a_value:\n",a_value)
print("b_value:\n",b_value)
print("c_value:\n",c_value)
使用tf.variable_scope()修改变量的命名空间
优点:结构更加清晰
def variable_namespace():
with tf.variable_scope("a_scope"):
a=tf.Variable(initial_value=10)
with tf.variable_scope("b_scope"):
b=tf.Variable(initial_value=20)
with tf.variable_scope("c_scope"):
c=tf.add(a,b)
print("a:\n",a)
print("b:\n",b)
print("c:\n",c)
init=tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init)
a_value,b_value,c_value=sess.run([a,b,c])
print("a_value:\n",a_value)
print("b_value:\n",b_value)
print("c_value:\n",c_value)
高级API
基础API
- tf.app
为TensorFlow进行的脚本提供一个main函数入口,可以定义脚本运行的flags - tf.image
TensorFlow的图像处理操作,主要是一些颜色变换,变形和图像的编码和解码 - tf.gfile
提供了一组文件操作函数 - tf.summary
用来生成TensorBoard可用的统计日志,生成了4种类型:audio,image,histogram,scalar - tf.python_io
用来读写TFRecords文件 - tf.train
这个模块提供了一些训练器,与tf.nn组合起来,实现一些网络的优化计算 - tf.nn
这个模块提供了一些构建神经网络的底层函数,TensorFlow构建网络的核心模块,其中包含了添加各种层的函数,比如添加卷积层,池化层等
高级API
- tf.keras
keras本来是一个独立的深度学习库,tensorflow将其学习过来,增加这部分模块在于快速构建模型 - tf.layers
高级API,以更高级的概念层来定义一个模型,类似tf.keras - tf.contrib
tf.contrib.layers提供将计算图中的网络层、正则化、摘要操作、是构建计算图的高级操作,但是tf.contrib包含不稳定和实验代码,有可能以后API会改变 - tf.estimator
一个Estimator相当于Model+Training+Evaluate的合体,在模块中,已经实现了几种简单的分类器和回归器,包括:Baseline,Learning和DNN。这里的DNN的网络,只是全连接网络,没有提供卷积之类的
关于TensorFlow的API图示
案例:实现线性回归
线性回归原理复习
- 构建模型
目标值和特征值关系:
y=w1x1+w2x2+…+wnxn+b - 构造损失函数
均方误差 - 优化损失
梯度下降
实现线性回归的训练
- 假设随机指定100个点,只有一个特征
- 数据本身的分布为y=0.8*x+0.7
API
- 矩阵运算 tf.matmul(x,w)
- 平方 tf.square(error)
- 均值 tf.reduce_mean(error)
梯度下降优化
- tf.train.GradientDescentOptimizer(learning_rate)
梯度下降优化
learning_rate:学习率,一般为0~1之间比较小的值
method: minimize(loss)
return:梯度下降op
- 准备真实数据
100个样本
x 特征值 (100,1)
y_true 目标值 (100,1)
y_true=0.8x+0.7 - 假定x和y之间的关系满足
y=kx+b
k≈0.8,b≈0.7
流程分析:
(100,1)*(1,1)=(100,1)
y_predict=x*weights(1,1)+bias(1,1)
(1) 构建模型
y_predict=tf.matmul(x,weights)+bias
(2)构造损失函数——均方误差
error=tf.reduce_mean(tf.square(y_predict-y_true))
(3)优化损失
optimizer=tf.train.GradientDescentOptimizer(learning_rate=0.01).minimize(error)
def test_demo():
"""
自定义线性回归模型
:return:
"""
#1.准备数据
X=tf.random_normal(shape=[100,1])
y_true=tf.matmul(X,[[0.8]])+0.7
#2.构造模型
# 定义模型参数用变量
weights=tf.Variable(initial_value=tf.random_normal(shape=[1,1]))
bias=tf.Variable(initial_value=tf.random_normal(shape=[1,1]))
y_predict=tf.matmul(X,weights)+bias
#3.构造损失函数
error=tf.reduce_mean(tf.square(y_predict-y_true))
#4.优化损失
optimizer=tf.train.GradientDescentOptimizer(learning_rate=0.01).minimize(error)
#5.初始化变量
init=tf.global_variables_initializer()
#6.开启会话
with tf.Session() as sess:
#初始化变量
sess.run(init)
#查看初始化模型参数后的值
print("训练前模型的参数为:权重%f,偏置%f,损失为%f"%(weights.eval(),bias.eval(),error.eval()))
#开始训练
for i in range(1000):
sess.run(optimizer)
print("第%d次训练后模型的参数为:权重%f,偏置%f,损失为%f"%(i+1,weights.eval(),bias.eval(),error.eval()))
return None;
在迭代次数一定的情况下,学习率越高,训练速度越快;
学习率一定的情况下,迭代次数越多,训练速度越快。
学习率的设置,步数的设置与梯度爆炸
学习率过大会出新梯度爆炸现象,如何解决梯度爆炸问题:
- 重新设计网路
- 调整学习率
- 使用梯度截断(在训练过程中检查和限制梯度的大小)
- 使用激活函数
变量的trainable设置观察
trainable变量设置是否学习
weights=tf.Variable(initial_value=tf.random_normal(shape=[1,1]),trainable=False)
设置为false,则weights变量不会再学习
增加其他功能
- 变量Tensorboard显示
- 增加命名空间
- 模型保存与加载
- 命令行参数设置
增加变量显示
- 收集变量
tf.summary.scalar(name=",tensor)收集对于损失函数和准确率等单值变量,name为变量的名字,tensor为值
tf.summary.histogram(name=",tensor)收集高维度的变量参数
tf.summary.image(name=",tensor)收集输入的图片张量能显示图片 - 合并变量写入事件文件
merged=tf.summary.merge_all()
运行合并:summary=sess.run(merged),每次迭代都需要运行
添加:FileWriter.add_summary(summary,i),i表示第几次的值
def test_demo02():
"""
自定义线性回归模型
:return:
"""
#1.准备数据
X=tf.random_normal(shape=[100,1])
y_true=tf.matmul(X,[[0.8]])+0.7
#2.构造模型
# 定义模型参数用变量
weights=tf.Variable(initial_value=tf.random_normal(shape=[1,1]))
bias=tf.Variable(initial_value=tf.random_normal(shape=[1,1]))
y_predict=tf.matmul(X,weights)+bias
#3.构造损失函数
error=tf.reduce_mean(tf.square(y_predict-y_true))
#4.优化损失
optimizer=tf.train.GradientDescentOptimizer(learning_rate=0.01).minimize(error)
#(2)收集变量
tf.summary.scalar("error",error)
tf.summary.histogram("weights",weights)
tf.summary.histogram("bias",bias)
#(3)合并变量
merged=tf.summary.merge_all()
#5.初始化变量
init=tf.global_variables_initializer()
#6.开启会话
with tf.Session() as sess:
#初始化变量
sess.run(init)
#(1)创建事件文件
file_writer=tf.summary.FileWriter("./tmp/linear",graph=sess.graph)
#查看初始化模型参数后的值
print("训练前模型的参数为:权重%f,偏置%f,损失为%f"%(weights.eval(),bias.eval(),error.eval()))
#开始训练
for i in range(100):
sess.run(optimizer)
print("第%d次训练后模型的参数为:权重%f,偏置%f,损失为%f"%(i+1,weights.eval(),bias.eval(),error.eval()))
#(3)运行合并变量操作
summary=sess.run(merged)
#(4)将每次迭代后的变量写入事件文件中
file_writer.add_summary(summary,i)
return None;
(1)创建事件文件
(2)收集变量
(3)合并变量
(4)每次迭代运行一次合并变量
(5)每次迭代将summary对象写入事件文件
增加命名空间
def test_demo03():
"""
自定义线性回归模型
:return:
"""
#1.准备数据
with tf.variable_scope("prepare-data"):
X=tf.random_normal(shape=[100,1])
y_true=tf.matmul(X,[[0.8]])+0.7
#2.构造模型
# 定义模型参数用变量
with tf.variable_scope("create_model"):
weights=tf.Variable(initial_value=tf.random_normal(shape=[1,1]))
bias=tf.Variable(initial_value=tf.random_normal(shape=[1,1]))
y_predict=tf.matmul(X,weights)+bias
#3.构造损失函数
with tf.variable_scope("loss_function"):
error=tf.reduce_mean(tf.square(y_predict-y_true))
#4.优化损失
with tf.variable_scope("optimizer"):
optimizer=tf.train.GradientDescentOptimizer(learning_rate=0.01).minimize(error)
#(2)收集变量
tf.summary.scalar("error",error)
tf.summary.histogram("weights",weights)
tf.summary.histogram("bias",bias)
#(3)合并变量
merged=tf.summary.merge_all()
#5.初始化变量
init=tf.global_variables_initializer()
#6.开启会话
with tf.Session() as sess:
#初始化变量
sess.run(init)
#(1)创建事件文件
file_writer=tf.summary.FileWriter("./tmp/linear",graph=sess.graph)
#查看初始化模型参数后的值
print("训练前模型的参数为:权重%f,偏置%f,损失为%f"%(weights.eval(),bias.eval(),error.eval()))
#开始训练
for i in range(100):
sess.run(optimizer)
print("第%d次训练后模型的参数为:权重%f,偏置%f,损失为%f"%(i+1,weights.eval(),bias.eval(),error.eval()))
#(3)运行合并变量操作
summary=sess.run(merged)
#(4)将每次迭代后的变量写入事件文件中
file_writer.add_summary(summary,i)
return None;
def test_demo04():
"""
自定义线性回归模型
:return:
"""
#1.准备数据
with tf.variable_scope("prepare-data"):
X=tf.random_normal(shape=[100,1],name="Features")
y_true=tf.matmul(X,[[0.8]])+0.7
#2.构造模型
# 定义模型参数用变量
with tf.variable_scope("create_model"):
weights=tf.Variable(initial_value=tf.random_normal(shape=[1,1]),name="Weights")
bias=tf.Variable(initial_value=tf.random_normal(shape=[1,1]),name="Bias")
y_predict=tf.matmul(X,weights)+bias
#3.构造损失函数
with tf.variable_scope("loss_function"):
error=tf.reduce_mean(tf.square(y_predict-y_true))
#4.优化损失
with tf.variable_scope("optimizer"):
optimizer=tf.train.GradientDescentOptimizer(learning_rate=0.01).minimize(error)
#(2)收集变量
tf.summary.scalar("error",error)
tf.summary.histogram("weights",weights)
tf.summary.histogram("bias",bias)
#(3)合并变量
merged=tf.summary.merge_all()
#5.初始化变量
init=tf.global_variables_initializer()
#6.开启会话
with tf.Session() as sess:
#初始化变量
sess.run(init)
#(1)创建事件文件
file_writer=tf.summary.FileWriter("./tmp/linear",graph=sess.graph)
#查看初始化模型参数后的值
print("训练前模型的参数为:权重%f,偏置%f,损失为%f"%(weights.eval(),bias.eval(),error.eval()))
#开始训练
for i in range(100):
sess.run(optimizer)
print("第%d次训练后模型的参数为:权重%f,偏置%f,损失为%f"%(i+1,weights.eval(),bias.eval(),error.eval()))
#(3)运行合并变量操作
summary=sess.run(merged)
#(4)将每次迭代后的变量写入事件文件中
file_writer.add_summary(summary,i)
return None;
模型的保存与加载
- tf.train.Saver(var_list=None,max_to_keep=5)
保存和加载模型(保存文件格式:checkpoint文件)
var_list:指定将要保存和还原的变量。它可以作为一个dict或一个列表传递
max_to_keep:指示要保留的最近检查点文件的最大数量,创建新文件时,会删除较旧的文件。如果无或0,则保留所有检查点文件。默认为5(即保留最新的5个检查点文件)
def test_demo05():
"""
自定义线性回归模型
:return:
"""
#1.准备数据
with tf.variable_scope("prepare-data"):
X=tf.random_normal(shape=[100,1],name="Features")
y_true=tf.matmul(X,[[0.8]])+0.7
#2.构造模型
# 定义模型参数用变量
with tf.variable_scope("create_model"):
weights=tf.Variable(initial_value=tf.random_normal(shape=[1,1]),name="Weights")
bias=tf.Variable(initial_value=tf.random_normal(shape=[1,1]),name="Bias")
y_predict=tf.matmul(X,weights)+bias
#3.构造损失函数
with tf.variable_scope("loss_function"):
error=tf.reduce_mean(tf.square(y_predict-y_true))
#4.优化损失
with tf.variable_scope("optimizer"):
optimizer=tf.train.GradientDescentOptimizer(learning_rate=0.01).minimize(error)
#(2)收集变量
tf.summary.scalar("error",error)
tf.summary.histogram("weights",weights)
tf.summary.histogram("bias",bias)
#(3)合并变量
merged=tf.summary.merge_all()
#创建saver对象
saver=tf.train.Saver()
#5.初始化变量
init=tf.global_variables_initializer()
#6.开启会话
with tf.Session() as sess:
#初始化变量
sess.run(init)
#(1)创建事件文件
file_writer=tf.summary.FileWriter("./tmp/linear",graph=sess.graph)
#查看初始化模型参数后的值
print("训练前模型的参数为:权重%f,偏置%f,损失为%f"%(weights.eval(),bias.eval(),error.eval()))
#开始训练
for i in range(100):
sess.run(optimizer)
print("第%d次训练后模型的参数为:权重%f,偏置%f,损失为%f"%(i+1,weights.eval(),bias.eval(),error.eval()))
#(3)运行合并变量操作
summary=sess.run(merged)
#(4)将每次迭代后的变量写入事件文件中
file_writer.add_summary(summary,i)
#保存模型
if(i%10==0):
saver.save(sess,"./tmp/model/my_linear.ckpt")
return None;
加载模型
def test_demo06():
"""
自定义线性回归模型
:return:
"""
#1.准备数据
with tf.variable_scope("prepare-data"):
X=tf.random_normal(shape=[100,1],name="Features")
y_true=tf.matmul(X,[[0.8]])+0.7
#2.构造模型
# 定义模型参数用变量
with tf.variable_scope("create_model"):
weights=tf.Variable(initial_value=tf.random_normal(shape=[1,1]),name="Weights")
bias=tf.Variable(initial_value=tf.random_normal(shape=[1,1]),name="Bias")
y_predict=tf.matmul(X,weights)+bias
#3.构造损失函数
with tf.variable_scope("loss_function"):
error=tf.reduce_mean(tf.square(y_predict-y_true))
#4.优化损失
with tf.variable_scope("optimizer"):
optimizer=tf.train.GradientDescentOptimizer(learning_rate=0.01).minimize(error)
#(2)收集变量
tf.summary.scalar("error",error)
tf.summary.histogram("weights",weights)
tf.summary.histogram("bias",bias)
#(3)合并变量
merged=tf.summary.merge_all()
#创建saver对象
saver=tf.train.Saver()
#5.初始化变量
init=tf.global_variables_initializer()
#6.开启会话
with tf.Session() as sess:
#初始化变量
sess.run(init)
#(1)创建事件文件
file_writer=tf.summary.FileWriter("./tmp/linear",graph=sess.graph)
#查看初始化模型参数后的值
print("训练前模型的参数为:权重%f,偏置%f,损失为%f"%(weights.eval(),bias.eval(),error.eval()))
#加载模型
if(os.path.exists("./tmp/model/checkpoint")):
saver.restore(sess,"./tmp/model/my_linear.ckpt")
print("训练后模型的参数为:权重%f,偏置%f,损失为%f"%(weights.eval(),bias.eval(),error.eval()))
命令行参数使用
- tf.app.flags,支持应用从命令行接收参数,可以用来指定集群配置等
tf.app.flags.DEFINE_integer(“max_step”,0,“训练模型的步数”)
tf.app.flags.DEFINE_string(“model_dir”,"",“模型保存的路径+模型名字”) - FLAGS=tf.app.flags.FLAGS
通过FLAGS.max_step调用命令行中传过来的参数 - 通过tf.app.run()启动main(argv)函数
#定义命令行参数
tf.app.flags.DEFINE_integer("max_step",100,"训练模型的步数")
tf.app.flags.DEFINE_string("model_dir","Unknown","模型保存的路径+模型名字")
FLAGS=tf.app.flags.FLAGS
def command_demo():
print("max_step:\n",FLAGS.max_step)
print("model_dir:\n",FLAGS.model_dir)
def main(argv):
print("hello")
print(argv)
if __name__ == '__main__':
tf.app.run()
更多推荐
已为社区贡献2条内容
所有评论(0)