TensorFlow机器学习(原书第2版)
上QQ阅读APP看书,第一时间看更新

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(...),这相当于在会话的上下文中调用Tensoreval()函数。

当你在交互式环境中运行TensorFlow代码时(用于调试或展示,或使用Jupyter,如本章后面所述),通常更倾向于在交互式模式中创建会话,在这种模式中,对eval()的任何调用都隐式地包含了会话。在这种方式下,会话变量就不需要在整个代码中传递,从而更容易专注于算法的部分,如清单2.6所示。

清单2.6 使用交互式会话模式