最近学习TensorFlow框架的使用,总是觉得有点怪怪的。在我先入为主的概念中,TensorFlow就是一个工具包,提供API给我调用实现功能就行了。然而事实并不是如此。
TensorFlow中的各种概念,占位符、张量、会话、计算图等等。单单这些概念就搞得我头大。所以觉得这个框架有点不一样,除了记住使用方法外,我觉得还是有必要理解这些概念。
TensorFlow
TensorFlow的概念很多资源都有详细介绍。简而言之就是张量流,这个概念对于通常的API有点不一样,并不是简单的运算,而是张量在计算图中的结点上进行流转流动。
张量
TensorFlow的概念就是张量在计算图中的结点上进行流转流动。张量就是数据。
TensorFlow中的所有流经计算图的数据都是张量。张量的概念可以对比常量、变量与向量。其中,零阶张量表示标量(scalar),代表一个数;一阶张量表示向量(vector),代表一维数组;n阶张量表示一个n维数组。
计算图
一直说到计算图。计算图到底是个什么东西?
简单来说,就是结点关联起来形成的图就是计算图,这个图是一个有向无环图。举个例子:
import tensorflow as tf
X = tf.constant(5)
Y = tf.constant(6)
Z = X * Y
print(X)
print(Y)
print(Z)
运行代码,发现打印出来的结果并不是5、6和30。而是
Tensor("Const:0", shape=(), dtype=int32)
Tensor("Const_1:0", shape=(), dtype=int32)
Tensor("mul:0", shape=(), dtype=int32)
可以看到,XYZ都是Tensor类型,我们可以把它理解为计算图中的结点。XY分别是5、6两个常量结点,而结点Z就是*
这个运算操作。虽然 *
看起来并不像是TensorFlow的操作,但实际上TensorFlow会重载这个操作符。而这个操作并不会运算5 * 6 = 30
这样的操作,而仅仅是生成一个运算关系的结点。
言归正传,经过定义XY结点,再通过Z结点关联,这样就有了一张真正的计算图。尽管这个图很简单。
会话
通过前面例子发现Z并不是执行的结果,而只是一个结点。整个计算图并没有计算,会话中才是真正执行。
会话的作用是处理内存分配和优化,使我们能够实际执行由计算图指定的计算。会话包含一个指向全局图的指针,该指针通过指向所有节点的指针不断更新。
当执行如下代码时:
with tf.Session() as sess:
print(sess.run([Z, X, Y]))
打印结果如下:
[30, 5, 6]
个人理解图的定义有点类似编程,然后会话是执行程序。没有运行或被调用的方法自然不会执行,也就不会产生结果。而TensorFlow中的layer则可以类比编程中的模块或者是类。