• TensorFlow 1+1

    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(变量张量)也同样可以为向量、矩阵乃至更高维的张量。