TensorFlow 用户编程接口演化简史
TL;DR TensorFlow 从 2015 年发布至今,用户编程接口经历了几次重大演化,本文将对这几次演化进行简要介绍,并讨论其背后的动机,方便读者理解 TensorFlow 在不同阶段的设计思路。 注解: 这里所说的用户编程接口,是指 TensorFlow 提供给用户的编程接口,而不是指 TensorFlow 的内部编程接口。 我们讨论的 TensorFlow 是一个泛义的概念,包括 TensorFlow 和 JAX 等基于相同底层的同样来自 Google 的机器学习框架。 TensorFlow 0.x 时代(2015 - 2017) 源代码:https://github.com/tensorflow/tensorflow/releases/tag/0.12.1 TensorFlow 0.x 时代的用户编程接口,后来被称为 TensorFlow Core, 是基于 Python 的,主要包括: tf.placeholder:用于定义占位符,用于表示输入数据的维度和类型,但不包含具体的数据。 tf.Variable:用于定义变量,用于表示模型参数,包含具体的数据。 tf.Session:用于执行计算图,将计算图中的节点映射到具体的设备上,并执行计算。 代码示例 一个经典的线性回归模型,可以用 TensorFlow 0.x 的代码表示如下: import tensorflow as tf sess = tf.InteractiveSession() # 定义模型输入 x = tf.placeholder(tf.float32, shape=[None, 784]) y_ = tf.placeholder(tf.float32, shape=[None, 10]) # 定义模型参数 W = tf.Variable(tf.zeros([784,10])) b = tf.Variable(tf.zeros([10])) sess.run(tf.global_variables_initializer()) # 初始化模型参数 # 预测值计算 y = tf.matmul(x,W) + b # 网络设计,这里是一个线性模型,y = Wx + b, W 和 b 是模型参数, x 是模型输入, y 是模型输出 # 定义损失函数 cross_entropy = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(y, y_)) # 交叉熵损失函数 # 定义优化器 train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy) # 训练模型 for i in range(1000): batch = mnist.train.next_batch(100) train_step.run(feed_dict={x: batch[0], y_: batch[1]}) TensorFlow 1.x 时代 (2017 - 2019) 在工作原理方面,TensorFlow 1.x 时代与 TensorFlow 0.x 时代的设计思路是一致的。但在用户编程接口方面,TensorFlow 1.x 时代的设计思路,与 TensorFlow 0.x 时代的设计思路有几个重大的变化: ...