系列博客链接:
(一)TensorFlow 框架介绍: https://www.cnblogs.com/kongweisi/p/11038395.html
(二)TensorFlow 框架之图与 TensorBoard:https://www.cnblogs.com/kongweisi/p/11038517.html
(三)TensorFlow 框架之会话: https://www.cnblogs.com/kongweisi/p/11038550.html
(四)TensorFlow 框架之张量: https://www.cnblogs.com/kongweisi/p/11039237.html
(五)TensorFlow 框架之变量 OP:https://www.cnblogs.com/kongweisi/p/11039254.html
本文概述:
应用 op 的 name 参数实现 op 的名字修改
应用 variable_scope 实现图程序作用域的添加
应用 scalar 或 histogram 实现张量值的跟踪显示
应用 merge_all 实现张量值的合并
应用 add_summary 实现张量值写入文件
应用 tf.train.saver 实现 TensorFlow 的模型保存以及加载
应用 tf.App.flags 实现命令行参数添加和使用
应用 reduce_mean,square 实现均方误差计算
应用 tf.train.GradientDescentOptimizer 实现有梯度下降优化器创建
应用 minimize 函数优化损失
知道梯度爆炸以及常见解决技巧
1, 线性回归原理复习
根据数据建立回归模型, w1x1+w2x2+.....+b = y, 通过真实值与预测值之间建立误差, 使用梯度下降优化得到损失最小对应的权重和偏置.
最终确定模型的权重和偏置参数. 最后可以用这些参数进行预测.
2, 案例: 实现线性回归的训练
2.1 案例确定
假设随机指定 100 个点, 只有一个特征(这里的 x, 将其都放在 100 行 1 列的数组即张量中, 便于与后面的 w 计算)
数据本身的分布为 y = 0.7 * x + 0.8
这里将数据分布的规律确定, 是为了使我们训练出的参数跟真实的参数 (即 0.7 和 0.8) 比较是否训练准确
2.2 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
2.3 步骤分析
1, 准备数据的特征值和目标值 inputs
2, 根据特征值建立线性回归模型(确定参数个数形状) inference
模型的参数必须使用变量 OP 创建(为了可训练)
3, 根据模型得出预测结果, 建立损失 loss
4, 梯度下降优化器优化损失 sgd_op
2.4 实现完整功能 def inputs(self):
- def inputs(self):
- """
- 获取特征值目标值数据数据
- :return:
- """ x_data = tf.random_normal([100, 1], mean=1.0, stddev=1.0, name="x_data")
- y_true = tf.matmul(x_data, [[0.7]]) + 0.8
- return x_data, y_true
- def inference(self, feature):
- """
- 根据输入数据建立模型
- :param feature:
- :param label:
- :return:
- """ with tf.variable_scope("linea_model"):
- # 2, 建立回归模型, 分析别人的数据的特征数量 --->权重数量, 偏置 b
- # 由于有梯度下降算法优化, 所以一开始给随机的参数, 权重和偏置
- # 被优化的参数, 必须得使用变量 op 去定义
- # 变量初始化权重和偏置
- # weight 2 维 [1, 1], 输入的 x 是[100, 1] 的列向量 bias [1]-->这里的偏置直接初始化为 0
- # x*w + b ----> y_predict
- # 变量 op 当中会有 trainable 参数决定是否训练
- self.weight = tf.Variable(tf.random_normal([1, 1], mean=0.0, stddev=1.0),
- name="weights")
- self.bias = tf.Variable(0.0, name='biases')
- # 建立回归公式去得出预测结果
- y_predict = tf.matmul(feature, self.weight) + self.bias
- return y_predict
- def loss(self, y_true, y_predict):
- """
- 目标值和真实值计算损失
- :return: loss
- """
- # 3, 求出我们模型跟真实数据之间的损失
- # 均方误差公式 --->MSE
- loss = tf.reduce_mean(tf.square(y_true - y_predict))
- return loss
- def sgd_op(self, loss):
- """
- 获取训练 OP
- :return:
- """
- # 4, 使用梯度下降优化器优化
- # 填充学习率: 0 ~ 1 学习率是非常小,
- # 学习率大小决定你到达损失一个步数多少
- # 最小化损失 ---->返回的这个 train_op, 是可以训练的, 之所以可以训练, 是因为之前的变量都是 tf.Variable()创建的
- train_op = tf.train.GradientDescentOptimizer(0.1).minimize(loss)
- return train_op
2.5 学习率的设置, 步长的设置与梯度爆炸
学习率越大, 训练到较好结果的步长越小; 学习率越小, 训练到较好结果的步长越大.
但是学习过大会出现梯度爆炸现象. 关于梯度爆炸 / 梯度消失 ?
在极端情况下, 权重的值变得非常大, 以至于溢出, 导致 NaN 值
如何解决梯度爆炸问题(深度神经网络当中更容易出现)
1, 重新设计网络
2, 调整学习率
3, 使用梯度截断(在训练过程中检查和限制梯度的大小)
4, 使用激活函数
2.6 变量的 trainable 设置观察
trainable 的参数作用, 指定是否训练
weight = tf.Variable(tf.random_normal([1, 1], mean=0.0, stddev=1.0), name="weights", trainable=False)
3, 增加其他功能
增加命名空间
变量 Tensorboard 显示
模型保存与加载
命令行参数设置
3.1 增加命名空间
使得代码结构更加清晰, Tensorboard 图结构清楚
with tf.variable_scope("lr_model"):
3.2 增加变量显示
目的: 在 TensorBoard 当中观察模型的参数, 损失值等变量值的变化
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_summa
来源: http://www.bubuko.com/infodetail-3095368.html