TensorFlow 1+1
TensorFlow本质上是一个符号式的(基于计算图的)计算框架。这里以计算1+1作为Hello World的示例。
- import tensorflow as tf
- # 定义一个“计算图”
- a = tf.constant(1) # 定义一个常量Tensor(张量)
- b = tf.constant(1)
- c = a + b # 等价于 c = tf.add(a, b),c是张量a和张量b通过Add这一Operation(操作)所形成的新张量
- sess = tf.Session() # 实例化一个Session(会话)
- c_ = sess.run(c) # 通过Session的run()方法对计算图里的节点(张量)进行实际的计算
- print(c_)
输出:
- 2
上面这个程序只能计算1+1,以下程序通过 tf.placeholder()
(占位符张量)和 sess.run()
的 feed_dict=
参数展示了如何使用TensorFlow计算任意两个数的和:
- import tensorflow as tf
- a = tf.placeholder(dtype=tf.int32) # 定义一个占位符Tensor
- b = tf.placeholder(dtype=tf.int32)
- c = a + b
- a_ = input("a = ") # 从终端读入一个整数并放入变量a_
- b_ = input("b = ")
- sess = tf.Session()
- c_ = sess.run(c, feed_dict={a: a_, b: b_}) # feed_dict参数传入为了计算c所需要的张量的值
- print("a + b = %d" % c_)
运行程序:
- >>> a = 2
- >>> b = 3
- a + b = 5
**变量**(Variable)是一种特殊类型的张量,使用 tf.get_variable()
建立,与编程语言中的变量很相似。使用变量前需要先初始化,变量内存储的值可以在计算图的计算过程中被修改。以下示例如何建立一个变量,将其值初始化为0,并逐次累加1。
- import tensorflow as tf
- a = tf.get_variable(name='a', shape=[])
- initializer = tf.assign(a, 0) # tf.assign(x, y)返回一个“将张量y的值赋给变量x”的操作
- a_plus_1 = a + 1 # 等价于 a + tf.constant(1)
- plus_one_op = tf.assign(a, a_plus_1)
- sess = tf.Session()
- sess.run(initializer)
- for i in range(5):
- sess.run(plus_one_op) # 对变量a执行加一操作
- a_ = sess.run(a) # 获得变量a的值并存入a_
- print(a_)
输出:
- 1.0
- 2.0
- 3.0
- 4.0
- 5.0
以下代码和上述代码等价,在声明变量时指定初始化器,并通过 tf.global_variables_initializer()
一次性初始化所有变量,在实际工程中更常用:
- import tensorflow as tf
- a = tf.get_variable(name='a', shape=[], initializer=tf.zeros_initializer) # 指定初始化器为全0初始化
- a_plus_1 = a + 1
- plus_one_op = tf.assign(a, a_plus_1)
- sess = tf.Session()
- sess.run(tf.global_variables_initializer()) # 初始化所有变量
- for i in range(5):
- sess.run(plus_one_op)
- a_ = sess.run(a)
- print(a_)
矩阵乃至张量运算是科学计算(包括机器学习)的基本操作。以下程序展示如何计算两个矩阵 和 的乘积:
- import tensorflow as tf
- A = tf.ones(shape=[2, 3]) # tf.ones(shape)定义了一个形状为shape的全1矩阵
- B = tf.ones(shape=[3, 2])
- C = tf.matmul(A, B)
- sess = tf.Session()
- C_ = sess.run(C)
- print(C_)
输出:
- [[3. 3.]
- [3. 3.]]
Placeholder(占位符张量)和Variable(变量张量)也同样可以为向量、矩阵乃至更高维的张量。