这里请注意一个问题,当你调用tf.constant()函数的时候,声明的常量就已经被初始化了,它们的值永远不变。而相反,当你调用tf.Variable()函数的时候,变量并没有被初始化,为了初始化所有的变量,你必须要运行一次如下代码:
init = tf.global_variables_initializer() sess.run(init) #init是初始化所有的全局变量,在没有调用sess.run()之前,变量都没有被初始化。
1.2.2.2. 占位符占位符是一个对象,你可以对它赋予不同类型和维度的数据,它依赖于计算图的结果,比如一个计算的期望输出。占位符犹如它的名字一样仅仅为要注入到计算图中的数据占据一个位置。声明占位符用tf.placeholder()函数,以下是一个例子:
x = tf.placeholder(tf.float32, shape=[2,2]) y = tf.identity(x) x_vals = np.random.rand(2,2) sess.run(y, feed_dict={x: x_vals}) ---result [[ 0.11068643 0.57449234] [ 0.26858184 0.83333433]]
1.2.3. 计算图(The Computational Graph)Tensorflow是一个通过计算图的形式来表述计算的编程系统,计算图也叫数据流图,可以把计算图看做是一种有向图,Tensorflow中的每一个计算都是计算图上的一个节点,而节点之间的边描述了计算之间的依赖关系。Tensorflow在创建Tensor的同时,并没有把任何值都加入到计算图中。
看如下代码清单:
import tensorflow as tf node1 = tf.constant(3.0, dtype=tf.float32) node2 = tf.constant(4.0) # also tf.float32 implicitly print(node1, node2) ---result Tensor("Const:0", shape=(), dtype=float32) Tensor("Const_1:0", shape=(), dtype=float32)
可以看到输出的并不是我们所期望的3.0 和 4.0 数字,而是一个node,通过sesson可计算出node的实际值。
sess = tf.Session() print(sess.run([node1, node2])) ---result [3.0, 4.0]
我们还可以通过操作符构建各种复杂的Tesnor Nodes
node3 = tf.add(node1, node2) print("node3:", node3) print("sess.run(node3):", sess.run(node3)) ---result node3: Tensor("Add:0", shape=(), dtype=float32) sess.run(node3): 7.0
上面的计算我们都是建立在静态的数据上,Tensorflow还提供了palceholder用于后期输入值的一个占位符
a = tf.placeholder(tf.float32) b = tf.placeholder(tf.float32) adder_node = a + b # + provides a shortcut for tf.add(a, b) print(sess.run(adder_node, {a: 3, b: 4.5})) print(sess.run(adder_node, {a: [1, 3], b: [2, 4]})) ---result 7.5 [ 3. 7.]
还可以再上面的计算途中加入更多操作,见下代码清单:
add_and_triple = adder_node * 3. print(sess.run(add_and_triple, {a: 3, b: 4.5})) ---result 22.5
在机器学习中,我们希望看到一个可随意输入的模型,就像上面代码清单一样,为让模型可以训练,我们需要能够修改图获得新的输出。Variables允许添加可训练参数,如果使用如下代码清单:
W = tf.Variable([.3], dtype=tf.float32) b = tf.Variable([-.3], dtype=tf.float32) x = tf.placeholder(tf.float32) linear_model = W * x + b init = tf.global_variables_initializer() sess.run(init) print(sess.run(linear_model, {x: [1, 2, 3, 4]})) ---result [ 0. 0.30000001 0.60000002 0.90000004]
接下来我们将计算图变得更为复杂,代码清单如下: