认识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)当中更容易出现)
    1. 重新设计网络
    2. 调整学习率
    3. 使用梯度截断(在训练过程中检查和限制梯度的大小)
    4. 使用激活函数
  • 如果要增加变量的显示,为了观察模型的参数、损失值等变量值的变化情况
  • 模型的保存与加载
    – 假设需要训练8万步,万一训练到4万步时服务器宕机了,开机后是否又从随机的变量值开始运行呢?肯定是不可以的,因为真正训练的时候是非常耗时的,因此就需要对当前的训练模型进行保存和加载。

以上是关于认识tensorflow-自模拟一个线性回归预测的主要内容,如果未能解决你的问题,请参考以下文章

tensorflow线性回归预测鲍鱼数据

tensorflow学习笔记 | 02 - 线性回归问题Numpy实战

TensorFlow训练Logistic回归

5.2 多元线性回归完成广告投放销售额预测——python实战

机器学习粗略认识--线性模型

Tensorflow之单变量线性回归问题的解决方法