认识tensorflow-自模拟一个线性回归预测
Posted wyply115
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了认识tensorflow-自模拟一个线性回归预测相关的知识,希望对你有一定的参考价值。
1. tensorflow概述
- 特点
- 概述
1.TensorFlow是一个采用数据流图(data flow graphs),用于数值计算的开源软件库。
2.从命名来理解:Tensor(张量)意味着N维数组,Flow(流)意味 着基于数据流图的计算。Tensorflow运行过程就是张量从图的一端流动到另一端 的计算过程。
3.:TensorFlow的开发过程中,重点在于构建执行流图。也就是:“Data Flow Graphs”,表示TensorFlow是一种基于图的计算框架,其中节点(Nodes)在图中表示数学操作,线(Edges)则表 示在节点间相互联系的多维数据数组,即张量(Tensor),这种基于流的架构让 TensorFlow具有非常高的灵活性。 - 基本概念
1 图(Graph):图描述了计算的过程,TensorFlow使用图来表示计算任务。
2 张量(Tensor):TensorFlow使用tensor表示数据。每个Tensor是一个类型化 的多维数组。
3 操作(op):图中的节点被称为op(opearation的缩写),一个op获得0个或 多个Tensor,执行计算,产生0个或多个Tensor。
4 会话(Session):图必须在称之为“会话”的上下文中执行。会话将图的op分发到诸如CPU或GPU之类的设备上执行。
5 变量(Variable):运行过程中可以被改变,用于维护状态。
6 feed和fetch:可以为任意的操作(arbitrary operation) 赋值或者从其中获取数据。相当于一些铲子,可以操作数据。
7 边:
实线边表示数据依赖,代表数据,即张量。任意维度的数据统称为张量。在机器 学习算法中,张量在数据流图中从前往后流动一遍就完成一次前向传播,而残差 从后向前流动一遍就完成一次反向传播。
虚线边表示控制依赖,可以用于控制操作的运行,这被用来确保happens——before关系,这类边上没有数据流过,但源节点必须在目的节点开始执行前完成。
8 程序结构:
TensorFlow的程序一般分为两个阶段:构建阶段和执行阶段;
构建阶段:op的执行步骤被描述称为一个图,然后使用TensorFlow提供的API 构建这个图。
执行阶段:将构建好的执行图(Operation Graph)在给定的会话中执行,并得到 执行结果。
2. 自实现一个线性回归预测
import tensorflow as tf
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' # 不显示警告
def myregression():
'''
自实现一个线性回归预测
:return:None
'''
# 变量作用域,使代码更加清晰,graph也更加清晰
with tf.variable_scope("data"):
# 1.准备数据,x特征值[100,1] y 目标值[100]
x = tf.random_normal([100,1], mean=1.75, stddev=0.5, name="x_data")
# 2.准备真实值 矩阵相乘必须是二维的
y_true = tf.matmul(x, [[0.7]]) + 0.8
with tf.variable_scope("model"):
# 3.建立线性回归模型,1个特征,1个权重,一个偏置 y = x*w +b
# 随机给一个权重和偏置的值,让他去计算损失,然后在当前状态下进行优化
# 必须用变量定义才能优化
# trainable参数:指定这个变量能否随着梯度下降进行优化
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
with tf.variable_scope("loss"):
# 4.建立损失函数,求均方误差
loss = tf.reduce_mean(tf.square(y_true-y_predict))
# 收集tensor
tf.summary.scalar("losses", loss)
tf.summary.histogram("weights", weight)
with tf.variable_scope("optimiaze"):
# 5.梯度下降优化损失,学习率一般指定在0~1之间小数或,1-10之间整数
train_op = tf.train.GradientDescentOptimizer(0.1).minimize(loss)
# 定义合并tensor的op
merged = tf.summary.merge_all()
# 定义一个初始化变量的op
init_op = tf.global_variables_initializer()
# 开启会话运行程序
with tf.Session() as sess:
# 初始化变量
sess.run(init_op)
# 打印第一次随机初始化的权重和偏置
print("随机初始化的权重为:%f, 偏置为:%f" %(weight.eval(), bias.eval()))
# 建立事件文件 之后运行命令:tensorboard --logdir="./summary" 启动图形化界面
filewriter = tf.summary.FileWriter("./summary", graph=sess.graph)
# 循环运行优化
for i in range(2000):
sess.run(train_op)
# 运行合并的tensor
summary = sess.run(merged)
filewriter.add_summary(summary, i)
print("第 %d 次优化的参数权重为:%f, 偏置为:%f" % (i, weight.eval(), bias.eval()))
return None
if __name__ == '__main__':
myregression()
运行结果:
真实值是0.7,0.8,由求解的结果看出已经相差不大了。
打开命令行,切换到代码文件夹运行命令:tensorboard --logdir="./summary"
访问: http://localhost:6006 可查看模型图
- 如上代码,如果将学习率改为0.3甚至更大,则导致预测的值会非常大,以至于溢出,导致NaN值,这种情况我们称之为:梯度爆炸/梯度消失
- 如何解决梯度爆炸问题(深度神经网络(如RNN)当中更容易出现)
- 重新设计网络
- 调整学习率
- 使用梯度截断(在训练过程中检查和限制梯度的大小)
- 使用激活函数
- 如果要增加变量的显示,为了观察模型的参数、损失值等变量值的变化情况
- 模型的保存与加载
– 假设需要训练8万步,万一训练到4万步时服务器宕机了,开机后是否又从随机的变量值开始运行呢?肯定是不可以的,因为真正训练的时候是非常耗时的,因此就需要对当前的训练模型进行保存和加载。
以上是关于认识tensorflow-自模拟一个线性回归预测的主要内容,如果未能解决你的问题,请参考以下文章
tensorflow学习笔记 | 02 - 线性回归问题Numpy实战