zoukankan      html  css  js  c++  java
  • TensorFlow 框架

    TensorFlow

    TensorFlow核心程序由2个独立部分组成:

        a:Building the computational graph构建计算图
        b:Running the computational graph运行计算图
    1.一个computational graph(计算图)是一系列的TensorFlow操作排列成一个节点图。
      1.1 构建计算图
    node1 = tf.constant(3.0, dtype=tf.float32)
    node2 = tf.constant(4.0)# also tf.float32 implicitly
    print(node1, node2)

    结果:

    Tensor("Const:0", shape=(), dtype=float32) Tensor("Const_1:0",shape=(), dtype=float32)

      1.2运行计算图

    我们必须用到session:一个session封装了TensorFlow运行时的控制和状态

    sess = tf.Session()
    print(sess.run([node1, node2]))

      1.3 我们可以组合Tensor节点操作(操作仍然是一个节点)来构造更加复杂的计算,

    node3 = tf.add(node1, node2)
    print("node3:", node3)
    print("sess.run(node3):", sess.run(node3))

      运行结果:

    node3:Tensor("Add:0", shape=(), dtype=float32)
    sess.run(node3):7.0

      1.4 TensorFlow提供一个统一的调用称之为TensorBoard,它能展示一个计算图的图片;如下面这个截图就展示了这个计算图

      1.5 一个计算图可以参数化的接收外部的输入,作为一个placeholders(占位符),一个占位符是允许后面提供一个值的。
    a = tf.placeholder(tf.float32)
    b = tf.placeholder(tf.float32)
    adder_node = a + b  # + provides a shortcut for tf.add(a, b)
      这里有点像一个function (函数)或者lambda表达式,我们定义了2个输入参数a和b,然后提供一个在它们之上的操作。我们可以使用
    feed_dict(传递字典)参数传递具体的值到run方法的占位符来进行多个输入,从而来计算这个图。  
    print(sess.run(adder_node, {a:3, b:4.5}))
    print(sess.run(adder_node, {a: [1,3], b: [2,4]}))

    7.5
    [3.  7.]
      在TensorBoard,计算图类似于这样:
      1.6我们可以增加另外的操作来让计算图更加复杂,比如
        add_and_triple = adder_node *3.
    print(sess.run(add_and_triple, {a:3, b:4.5}))
    输出结果是:
    22.5
      在TensorBoard,计算图类似于这样:
      1.7 在机器学习中,我们通常想让一个模型可以接收任意多个输入,比如大于1个,好让这个模型可以被训练,在不改变输入的情况下,
    我们需要改变这个计算图去获得一个新的输出。变量允许我们增加可训练的参数到这个计算图中,它们被构造成有一个类型和初始值:
    W = tf.Variable([.3], dtype=tf.float32)
    b = tf.Variable([-.3], dtype=tf.float32)
    x = tf.placeholder(tf.float32)
    linear_model = W*x + b

      1.8 当你调用tf.constant时常量被初始化,它们的值是不可以改变的,而变量当你调用tf.Variable时没有被初始化,

    在TensorFlow程序中要想初始化这些变量,你必须明确调用一个特定的操作,如下:
    1 init = tf.global_variables_initializer()
    2 sess.run(init)

      1.9 要实现初始化所有全局变量的TensorFlow子图的的处理是很重要的,直到我们调用sess.run,这些变量都是未被初始化的。

    既然x是一个占位符,我们就可以同时地对多个x的值进行求值linear_model,例如:

    1 print(sess.run(linear_model, {x: [1,2,3,4]}))
    2 求值linear_model 
    3 输出为
    4 [0.  0.30000001  0.60000002  0.90000004]

      1.10 我们已经创建了一个模型,但是我们至今不知道它是多好,在这些训练数据上对这个模型进行评估,我们需要一个

    y占位符来提供一个期望的值,并且我们需要写一个loss function(损失函数),一个损失函数度量当前的模型和提供
    的数据有多远,我们将会使用一个标准的损失模式来线性回归,它的增量平方和就是当前模型与提供的数据之间的损失
    ,linear_model - y创建一个向量,其中每个元素都是对应的示例错误增量。这个错误的方差我们称为tf.square。然后
    ,我们合计所有的错误方差用以创建一个标量,用tf.reduce_sum抽象出所有示例的错误。
    1 y = tf.placeholder(tf.float32)
    2 squared_deltas = tf.square(linear_model - y)
    3 loss = tf.reduce_sum(squared_deltas)
    4 print(sess.run(loss, {x: [1,2,3,4], y: [0, -1, -2, -3]}))
    5 输出的结果为
    6 23.66

      1.11 我们分配一个值给W和b(得到一个完美的值是-1和1)来手动改进这一点,一个变量被初始化一个值会调用tf.Variable,

    但是可以用tf.assign来改变这个值,例如:
    fixW=tf.assign(W,[1.])
    fixb = tf.assign(b, [1.])
    sess.run([fixW, fixb])
    print(sess.run(loss, {x: [1,2,3,4], y: [0, -1, -2, -3]}))
    最终打印的结果是:
    0.0

      1.12 tf.train APITessorFlow提供optimizers(优化器),它能慢慢改变每一个变量以最小化损失函数,最简单的优化器是

    gradient descent(梯度下降),它根据变量派生出损失的大小,来修改每个变量。通常手工计算变量符号是乏味且容易出错的,
    因此,TensorFlow使用函数tf.gradients给这个模型一个描述,从而能自动地提供衍生品,简而言之,优化器通常会为你做这个。例如:
        optimizer = tf.train.GradientDescentOptimizer(0.01)
    train = optimizer.minimize(loss)
    sess.run(init)# reset values to incorrect defaults.
    for iin range(1000):
       sess.run(train, {x: [1,2,3,4], y: [0, -1, -2, -3]})
     
    print(sess.run([W, b]))
    输出结果为
    [array([-0.9999969], dtype=float32), array([ 0.99999082], dtype=float32)]

    本文仅用于学习研究,非商业用途,如需参考,请注明出处,作者:木子龙。

    本文参考了以下地址的讲解,万分感谢,如有侵权,请联系我会尽快删除,929994365@qq.com:

    https://blog.csdn.net/lengguoxing/article/details/78456279

    https://www.cnblogs.com/kang06/p/9373600.html

     
     
     
     
     
     
     
     
     
  • 相关阅读:
    首页下拉广告代码
    索引 CREATE INDEX
    苏三起解 故事
    日期正则表达式
    除去非空字符串函数
    数据库什么是字段应该设置索引
    警务通
    动态生成缩略图
    超级实用且不花哨的js代码大全
    无线警务移动办公系统解决方案
  • 原文地址:https://www.cnblogs.com/missidiot/p/9414451.html
Copyright © 2011-2022 走看看