2.4 在会话中执行运算
会话是软件系统的一个环境,它描述了代码行应该如何运行。在TensorFlow中,会话设置硬件设备(如CPU和GPU)如何相互通信。这样,你就可以设计自己的机器学习算法,而不用担心要对运行它的硬件进行管理。之后,你可以配置会话以更改其行为,而无须更改一行机器学习代码。
为了执行一个运算并得到结果,TensorFlow需要一个会话。只有注册的会话才能填充Tensor
对象的值。为此,必须使用tf.Session()
创建一个会话类,并告诉它运行一个运算符,如清单2.5所示。这个结果将在后续的计算中继续用到。
恭喜!你已经编写了第一个完整的TensorFlow代码。尽管这段代码所做的只是矩阵取反得到[[-1,-2]]
,但其核心开销和框架与其他TensorFlow程序是一样的。会话不仅配置了你的代码将在机器上运行的位置,而且还设计了如何布局进行并行计算。
清单2.5 使用会话
代码性能似乎有点慢
你可能已经注意到,运行代码花费的时间比你预期的要多几秒钟。TensorFlow要用几秒钟来取反一个小矩阵,这似乎不大正常。但是当面对更大、更复杂的计算时,会有大量的预处理对库进行优化。
每个Tensor
对象都有一个eval()
函数来执行取值的数学运算。但是执行eval()
函数需要为库定义一个会话对象,以便最好地使用底层硬件。在清单2.5中,我们使用了sess.run(...)
,这相当于在会话的上下文中调用Tensor
的eval()
函数。
当你在交互式环境中运行TensorFlow代码时(用于调试或展示,或使用Jupyter,如本章后面所述),通常更倾向于在交互式模式中创建会话,在这种模式中,对eval()
的任何调用都隐式地包含了会话。在这种方式下,会话变量就不需要在整个代码中传递,从而更容易专注于算法的部分,如清单2.6所示。
清单2.6 使用交互式会话模式