3.7 通过一个示例来认识TensorFlow
现在让我们结合示例对TensorFlow框架中的一些基本组件进行更多的解读。我们编写一个示例来执行以下计算,这在神经网络中非常常见:
h = sigmoid(W * x + b)
这里W和x是矩阵,b是向量,*表示点积。sigmoid是一个非线性变换,由下式给出:
我们将逐步讨论如何通过TensorFlow进行上述计算。
首先,我们需要导入TensorFlow和NumPy。在Python中运行任何类型的TensorFlow或NumPy相关操作之前,均必须导入它们:
import tensorflow as tf import numpy as np
接下来,我们定义一个图对象,稍后将使用运算或操作和变量填充它们:
graph = tf.Graph() # 创建一个图(graph)对象 session = tf.InteractiveSession(graph=graph) # 创建一个会话(session)对象
graph对象包含一个计算图,该计算图连接我们在程序中定义的各种输入和输出,以获得最终所需的输出(即它定义W、x和b如何被连接以便我们根据图生成h)。此外,我们将定义一个会话对象,该对象以定义的图作为输入,执行该图。我们后面会详细讨论这些元素。
要创建新的图对象,可以使用以下操作:
graph = tf.Graph()
也可以使用以下操作来获取TensorFlow默认计算图:
graph = tf.get_default_graph()
现在我们将定义一些张量,即x、W、b和h。在TensorFlow中,定义张量有几种不同的方法,在这里列出三种:
(1)首先,x是一个占位符。顾名思义,占位符没有被初始化。相反,我们将在图执行时提供一些数值。
(2)其次,这里有变量W和b。由于变量是可变的,这意味着它们的值可以随时间而变化。
(3)最后,我们有h,这是一个通过对x、W和b执行一些操作而产生的不可变的张量:
x = tf.placeholder(shape=[1,10],dtype=tf.float32,name='x') W = tf.Variable(tf.random_uniform(shape=[10,5], minval=-0.1,maxval=0.1, dtype=tf.float32),name='W') b = tf.Variable(tf.zeros(shape=[5],dtype=tf.float32),name='b') h = tf.nn.sigmoid(tf.matmul(x,W) + b)
注意,对于W和b,我们提供了一些重要的参数:
tf.random_uniform(shape=[10,5], minval=-0.1, maxval=0.1,dtype=tf.float32) tf.zeros(shape=[5],dtype=tf.float32)
这些被称为变量初始化器,是最初分配给W和b变量的张量。变量不能在没有初始值的情况下作为占位符流动,并且需要始终为它们分配一些数值。这里,tf.random_uniform意味着我们在minval(-0.1)和maxval(0.1)之间均匀地采样以将值赋给张量,并且tf.zeros用零初始化张量。在定义张量时,定义张量的shape也非常重要。shape属性定义张量每个维度的大小。例如,如果形状(shape)是[10,5],这意味着它将是一个二维结构,在0轴上有10个元素,在1轴上有5个元素。
接下来,我们将进行初始化操作,初始化图中的变量W和b:
tf.global_variables_initializer().run()
现在,将执行计算图以获得我们需要的最终输出h。这是通过运行session.run(...)来完成的,我们将以占位符的值作为session.run()命令的参数:
h_eval = session.run(h,feed_dict={x: np.random.rand(1,10)})
最后,关闭会话,释放session对象持有的所有资源。
session.close()
以下是此TensorFlow示例的完整代码。本章中的所有代码示例都将在ch3文件夹中的3_tensorflow_introduction.ipynb文件中提供: