本篇文章简单介绍一下TensorFlow框架的programming stack,读者通过此文将了解不同层次的开发者应该使用哪个层次的编程接口。我们将TensorFlow的API划分为四个层次(见下图),分别是:
- 高阶API,Estimator
- 中阶API,Layers、Datasets、Metrics
- 低阶API,Python、C++、Java、Go等编程语言接口
- Kernel,TensorFlow的分布式执行引擎
对于大部分使用TensorFlow的机器学习/深度学习开发者,只需要调用Layers
的API搭建神经网络模型,调用Datasets
的API实现数据预处理、批量化等input pipeline,借助Metrics
的API定义模型推理结果的指标,最后使用Estimators
将Layers、Datasets、Metrics
组合到一起对模型进行训练、评估以及训练过程中的管理等。所以,如果你是一名数据科学家,欲使用TensorFlow建立模型解决具体应用问题,那么使用TensorFlow的中、高阶API是最好的选择。
TensorFlow的中、高阶API参见:
- Estimators
- Layers
- Datasets
- Metrics
值得注意的是,上述中、高阶API都是在Python编程语言基础上建立的,只能通过Python编程使用这些中、高阶API。(当然,也不排除后续会在其他编程语言上发布API。) 当前,TensorFlow最新版本为1.12.0(2018年11月08日发布),据信在2019年初2.0版本发布后tf.keras.layers
会取代现有的tf.layers
,那时,tf.keras
会成为当之无愧的中、高阶API。(其实,现在的tf.layers
中很多方法的实现都调用了tf.keras
的接口)
低阶API主要是一些特定的运算(operations)在不同编程语言上的实现,以及通过图、会话等编程概念管理程序的运行。例如二维卷积tf.nn.conv2d()
:
tf.nn.conv2d(
input,
filter,
strides,
padding,
use_cudnn_on_gpu=True,
data_format='NHWC',
dilations=[1, 1, 1, 1],
name=None
)
与中阶API的二维卷积tf.layers.conv2d()
:
tf.layers.conv2d(
inputs,
filters,
kernel_size,
strides=(1, 1),
padding='valid',
data_format='channels_last',
dilation_rate=(1, 1),
activation=None,
use_bias=True,
kernel_initializer=None,
bias_initializer=tf.zeros_initializer(),
kernel_regularizer=None,
bias_regularizer=None,
activity_regularizer=None,
kernel_constraint=None,
bias_constraint=None,
trainable=True,
name=None,
reuse=None
)
tf.layers.conv2d()
不只是完成tf.nn.conv2d()
的2d卷积,它还负责激活、偏置项、初始化方法、正则化方法、约束条件、是否可训练、可复用等等。如果查看源代码,你会发现高阶的tf.layers.conv2d()
最终调用了低阶tf.nn.conv2d()
来实现2d卷积,并且调用其他低阶API完成初始化、激活、正则化、加偏置项等运算。
因此,低阶API完成一些最原始的、不可细分的运算和操作,高阶API提供对常见运算模式(例如卷积层的卷积+偏置项+BN+激活)的组合并发布给用户灵活调用。
最底层的Kernel是运算/操作在某类设备上的具体实现,例如卷积运算在CPU、GPU、TPU上分别提供不同的kernel进行运算。如果你想在某类特定类型的设备上实现或优化某一个运算,满足能耗、性能等方面的要求,那么你需要在这一层实现特定的kernel。对TensorFlow进行扩展,参见TensorFlow Architecture