• 译自learningtensorflow.com

    一个简单的例子

  • Tensorflow当中的运算操作是直到请求时才会进行的。也就是说,它是一种懒惰的计算,这样对你的代码运行有很大的帮助和改善:

    • 复合变量的快速运算
    • 多系统的分布式计算,包括GPUs
    • 减少了一些计算的冗余
  • 让我们来看一下这段code的实践。一个非常简单的python script:(请保证您已经安装好python)

    1
    2
    3
    x = 35
    y = x + 5
    print(y)
  • tf_logo
    tf_logo
  • 这段script只是创建了一个值为35的变量x,然后创建一个新的变量y,它的值定为x+5,然后输出。那么这么一段简单的代码用tensorflow是怎么实现的呢?(请保证您已经安装好tensorflow)

    1
    2
    3
    4
    5
    import tensorflow as tf

    x = tf.constant(35, name = "x")
    y = tf.Variable(x + 5, name = "y")
    print(y)
  • tf_logo
    tf_logo
  • 运行本段代码,你可能会返回类似上面的结果,这很明显不是40。

  • 为什么呢?为什么这里输出的结果不是40呢?因为这段代码做了以下这些操作:

    • 导入module tensorflow并起了一个别名 tf
    • 创建了一个常量x,并且赋值为35
    • 创建了一个变量y,并且把它的值定义为等式:x + 5
    • 输出等式对象y
  • 这段代码和python当中的微小区别是y并没有立刻计算了x + 5的值。它的定义是:当y被计算时,获取x当时的值,再加5就是y的值。所以,上面的y值的计算从来就没有被执行过。

  • 我们来修改一下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    import tensorflow as tf

    x = tf.constant(35, name = "x")
    y = tf.Variable(x + 5, name = "y")

    # 最新版本的tensorflow已经改为 tf.global_variables_initializer()来对变量进行初始化
    model = tf.initialize_all_variables()

    with tf.Session() as session:
    sess.run(model)
    print(sess.run(y))
  • tf_logo
    tf_logo
  • 我们把print(y)这个语句删掉了,然后我们创建了一个session,用它来实际上计算y的值。它确实非常像引用,但它实际上是这样工作的:

    • 导入module tensorflow并起了一个别名 tf
    • 创建了一个常量x,并且赋值为35
    • 创建了一个变量y,并且把它的值定义为等式:x + 5
    • 初始化所有变量 tf.global_variables_initializer()
    • 创建一个session来计算y的值
    • 运行第4句当中的model
    • 运行y的值,并且指向了y的当前值
  • 上面的第4句:tf.global_variables_initializer()就是奇迹发生的地方。在这一步,一个保存着变量之间的依赖关系的图生成了。这里是y的值依赖x,然后把x的值加上5.请一定记住y的值的计算一直到session.run(y)这里才执行,然后这里再去计算变量之间的等式和关系。