TensorFlow

DistBelief

从2010年开始，谷歌大脑创建DistBelief作为他们的第一代专有的机器学习系统。50多个团队在Google和其他Alphabet公司在商业产品部署了DistBelief的深度学习神经网络，包括Google搜索、Google语音搜索、广告、Google 相册、Google地图、Google街景、Google翻译和YouTube。Google指派计算机科学家，如Geoffrey Hinton和Jeff Dean，简化和重构DistBelief的代码库，使其变成一个更快、更健壮的应用级别代码库，形成了TensorFlow。2009年，Hinton领导的研究小组大大减少使用DistBelief的神经网络的错误数量，通过Hinton在广义反向传播的科学突破。最值得注意的是，Hinton的突破直接使Google语音识别软件中的错误减少至少25%。

TensorFlow

TensorFlow是谷歌大脑的第二代机器学习系统。
从0.8.0版本（发布于2016年4月）开始本地的支持分布式运行。
从0.9.0版本（发布于2016年6月）开始支持iOS。
从0.12.0版本（发布于2016年12月）开始支持Windows系统。该移植代码主要由微软贡献。
1.0.0版本发布于2017年2月11日。虽然参考实现运行在单台设备，TensorFlow可以运行在多个CPU和GPU（和可选的CUDA扩展和图形处理器通用计算的SYCL扩展）。TensorFlow可用于64位Linux、macOS和Windows，以及移动计算平台，包括Android和iOS。
TensorFlow的计算使用有状态的数据流图表示。TensorFlow的名字来源于这类神经网络对多维数组执行的操作。这些多维数组被称为张量（Tensor）。2016年6月，Jeff Dean称在GitHub有1500个库提到了TensorFlow，其中只有5个来自Google。

张量处理单元（TPU）

2016年5月，Google宣布了张量处理单元（TPU），一个专为机器学习和TensorFlow全定制的专用集成电路。TPU是一个可编程的人工智能加速器，提供高吞吐量的低精度计算（如8位），面向使用或运行模型而不是训练模型。Google宣布他们已经在数据中心中运行TPU长达一年多，发现它们对机器学习提供一个数量级更优的每瓦特性能。
2017年5月Google宣布第二代张量处理单元，并在Google Compute Engine中可用。第二代TPU提供最高180 teraflops性能，组装成64个TPU的集群时提供最高11.5 petaflops性能。

TensorFlow Lite

2017年5月Google宣布从Android Oreo开始，提供一个专用于Android开发的软件栈TensorFlow Lite。

应用

Google于2015年10月26日正式发布了RankBrain，由TensorFlow支持。

特性

TensorFlow提供了一个Python API，以及C++、Haskell、Java、Go和Rust API。第三方包可用于C#、.NET Core、Julia、R和Scala。
TensorFlow的底层核心引擎由C++实现，通过 gRPC 实现网络互访、分布式执行。虽然它的Python/C++/Java API共享了大部分执行代码，但是有关于反向传播梯度计算的部分需要在不同语言单独实现。当前只有Python API较为丰富的实现了反向传播部分。所以大多数人使用Python进行模型训练，但是可以选择使用其它语言进行线上推理。
TensorFlow在Windows和Linux上支持使用Bazel 或 CMake 构建，在某些平台上也支持直接使用GNU Make 进行编译。

例子

例：Hello World。
import tensorflow as tfhw = tf.constant("Hello World")with tf.Session() as sess:
 print(sess.run(hw))
例：两个矩阵相乘。
import tensorflow as tf# Build a dataflow graph.c = tf.constant([[1.0, 2.0], [3.0, 4.0]])d = tf.constant([[1.0, 1.0], [0.0, 1.0]])e = tf.matmul(c, d)# Construct a `Session` to execute the graph.with tf.Session() as sess:
  # Execute the graph and store the value that `e` represents in `result`.
  result = sess.run(e)print(result)
例：使用Feeding在执行时传入参数
import tensorflow as tf# Build a dataflow graph.c = tf.constant([[1.0, 2.0], [3.0, 4.0]])d = tf.constant([[1.0, 1.0], [0.0, 1.0]])e = tf.matmul(c, d)# Construct a `Session` to execute the graph.sess = tf.Session()# Execute the graph and store the value that `e` represents in `result`.result = sess.run(e,feed_dict={c:[[0.0, 0.0], [3.0, 4.0]]})print(result)sess.close()
TensorFlow的一大特色是其图中的节点可以是带状态的。
例：使用占位符
input_placeholder = tf.placeholder(tf.int32) 
sess = tf.Session() 
print (sess.run(input_placeholder, feed_dict={input_placeholder: 2}))sess.close()
例：使用变量、给变量赋值
使用tf.get_variable()创建变量。tf.get_variable() 的前两个参数是必需的，其余参数是可选的。tf.get_variable(name，shape)。name 是一个唯一标识这个变量对象的字符串。它必须相对于全局图是唯一的，所以要明了你使用过的所有命名，确保没有重复。shape 是与张量形状对应的整数数组，按顺序每个维度只有一个整数。一个 3x8 矩阵形状是[3, 8]。要创建一个标量，就需要使用形状为[] 的空列表。有两种将值放入变量的方法：初始化器和tf.assign()。初始化器应该把声明（tf.constant_initializer）与执行初始化（tf.global_variables_initializer）两种节点配合使用。
import tensorflow as tfcount_variable = tf.get_variable("count", [])zero_node = tf.constant(0.)assign_node = tf.assign(count_variable, zero_node)sess = tf.Session()sess.run(assign_node)print (sess.run(count_variable))
 
const_init_node = tf.constant_initializer(0.)count_variable1 = tf.get_variable("count1", [], initializer=const_init_node)init = tf.global_variables_initializer()sess.run(init)print (sess.run(count_variable1))sess.close()
例：带状态的图
import tensorflow as tf# Build a dataflow graph.count = tf.Variable([0],trainable=False);init_op = tf.global_variables_initializer()update_count = count.assign_add(tf.constant([2]))# Construct a `Session` to execute the graph.sess = tf.Session()sess.run(init_op)for step in range(10):
    result = sess.run(update_count)
    print("step %d: count = %g" % (step,result))sess.close()
例：梯度计算
import tensorflow as tf# Build a dataflow graph.filename_queue = tf.train.string_input_producer(['1.txt'],num_epochs=1)reader = tf.TextLineReader()key,value = reader.read(filename_queue)num = tf.decode_csv(value,record_defaults=[[0]])x = tf.Variable([0])loss = x * numgrads = tf.gradients([loss],x)grad_x = grads[0]def train_fn(sess):
  train_fn.counter += 1
  result = sess.run(grad_x)
  print("step %d: grad = %g" % (train_fn.counter,result))train_fn.counter = 0sv = tf.train.Supervisor()tf.train.basic_train_loop(sv,train_fn)
假设1.txt的内容为：
3
2
5
8
那么上述程序的输出应该为：
step 1: grad = 3
step 2: grad = 2
step 3: grad = 5
step 4: grad = 8

应用

广泛的应用程序使用TensorFlow作为基础，其中它已成功实现自动化图像字幕软件，例如DeepDream。2015年10月26日，Google正式启用了由TensorFlow提供支持的RankBrain。RankBrain现在处理大量的搜索查询，替换和补充传统的静态算法搜索结果。