TensorFlow 1+1

TensorFlow本质上是一个符号式的(基于计算图的)计算框架。这里以计算1+1作为Hello World的示例。

  1. import tensorflow as tf
  2.  
  3. # 定义一个“计算图”
  4. a = tf.constant(1) # 定义一个常量Tensor(张量)
  5. b = tf.constant(1)
  6. c = a + b # 等价于 c = tf.add(a, b),c是张量a和张量b通过Add这一Operation(操作)所形成的新张量
  7.  
  8. sess = tf.Session() # 实例化一个Session(会话)
  9. c_ = sess.run(c) # 通过Session的run()方法对计算图里的节点(张量)进行实际的计算
  10. print(c_)

输出:

  1. 2

上面这个程序只能计算1+1,以下程序通过 tf.placeholder() (占位符张量)和 sess.run()feed_dict= 参数展示了如何使用TensorFlow计算任意两个数的和:

  1. import tensorflow as tf
  2.  
  3. a = tf.placeholder(dtype=tf.int32) # 定义一个占位符Tensor
  4. b = tf.placeholder(dtype=tf.int32)
  5. c = a + b
  6.  
  7. a_ = input("a = ") # 从终端读入一个整数并放入变量a_
  8. b_ = input("b = ")
  9.  
  10. sess = tf.Session()
  11. c_ = sess.run(c, feed_dict={a: a_, b: b_}) # feed_dict参数传入为了计算c所需要的张量的值
  12. print("a + b = %d" % c_)

运行程序:

  1. >>> a = 2
  2. >>> b = 3
  3. a + b = 5

**变量**(Variable)是一种特殊类型的张量,使用 tf.get_variable() 建立,与编程语言中的变量很相似。使用变量前需要先初始化,变量内存储的值可以在计算图的计算过程中被修改。以下示例如何建立一个变量,将其值初始化为0,并逐次累加1。

  1. import tensorflow as tf
  2.  
  3. a = tf.get_variable(name='a', shape=[])
  4. initializer = tf.assign(a, 0) # tf.assign(x, y)返回一个“将张量y的值赋给变量x”的操作
  5. a_plus_1 = a + 1 # 等价于 a + tf.constant(1)
  6. plus_one_op = tf.assign(a, a_plus_1)
  7.  
  8. sess = tf.Session()
  9. sess.run(initializer)
  10. for i in range(5):
  11. sess.run(plus_one_op) # 对变量a执行加一操作
  12. a_ = sess.run(a) # 获得变量a的值并存入a_
  13. print(a_)

输出:

  1. 1.0
  2. 2.0
  3. 3.0
  4. 4.0
  5. 5.0

以下代码和上述代码等价,在声明变量时指定初始化器,并通过 tf.global_variables_initializer() 一次性初始化所有变量,在实际工程中更常用:

  1. import tensorflow as tf
  2.  
  3. a = tf.get_variable(name='a', shape=[], initializer=tf.zeros_initializer) # 指定初始化器为全0初始化
  4. a_plus_1 = a + 1
  5. plus_one_op = tf.assign(a, a_plus_1)
  6.  
  7. sess = tf.Session()
  8. sess.run(tf.global_variables_initializer()) # 初始化所有变量
  9. for i in range(5):
  10. sess.run(plus_one_op)
  11. a_ = sess.run(a)
  12. print(a_)

矩阵乃至张量运算是科学计算(包括机器学习)的基本操作。以下程序展示如何计算两个矩阵 \begin{bmatrix} 1 & 1 & 1 \\ 1 & 1 & 1 \end{bmatrix}\begin{bmatrix} 1 & 1 \\ 1 & 1 \\ 1 & 1 \end{bmatrix} 的乘积:

  1. import tensorflow as tf
  2.  
  3. A = tf.ones(shape=[2, 3]) # tf.ones(shape)定义了一个形状为shape的全1矩阵
  4. B = tf.ones(shape=[3, 2])
  5. C = tf.matmul(A, B)
  6.  
  7. sess = tf.Session()
  8. C_ = sess.run(C)
  9. print(C_)

输出:

  1. [[3. 3.]
  2. [3. 3.]]

Placeholder(占位符张量)和Variable(变量张量)也同样可以为向量、矩阵乃至更高维的张量。