TensorFlow 简介
TensorFlow是由Jeff Dean领头的谷歌大脑团队基于谷歌内部第一代深度学习系统DistBelief改进而来的通用计算框架。DistBelief是谷歌2011年开发的内部深度学习工具,这个工具在谷歌内部已经获得了巨大的成功。
TensorFlow是谷歌于2015年11月9日正式开源的计算框架,并于2017年2月16日,TensorFlow 1.0版本正式发布, 这个版本具有里程碑的意义。TensorFlow计算框架可以很好地支持深度学习的各种算法,但它的应用也不限于深度学习。
除了在谷歌内部大规模使用之外,TensorFlow也受到了工业界和学术界的广泛关注。在Google I/O 2016的大会上,Jeff Dean提到已经有1500多个GitHub的代码库中提到了TensorFlow,而只有5个是谷歌官方提供的。如今,包括优步(Uber)、Snapchat、Twitter、京东、小米等国内外科技公司也纷纷加入了使用TensorFlow的行列。正如谷歌在TensorFlow开源原因中所提到的一样,TensorFlow正在建立一个标准,使得学术界可以更方便地交流学术研究成果,工业界可以更快地将机器学习应用于生产之中。
此外由于深度学习的巨大成功,深度学习框架也成了豪强必争之地,从下面的图表中可以看出TesnorFlow 目前占有一定的优势。
TensorFlow 基础
TensorFlow 核心程序可以分为这两个部分:
- 构造 computational graph
- 运行 computational graph
computational graph
是由一系列的 operation的作为节点(nodes) 按照特定的方式排列形成的图,operation 的输入输出都是Tensor。就是说TensorFlow 就是运行computational graph, 这个图的节点是operations, 边是用来连接operation, operation 的输入输出都是Tensor;
下面是一些核心概念:
Tensor(张量):
tensor 是一个特定形状(shape)的数组,这个数组的元素必须是TensorFlow 的基础类型; 下面用例子来具体解释下:
3 # 这个tensor的rank 为0 并且 shape 为 []
[1.,2.,3.] # 这个tensor的rank 为1 并且 shape 为 [3]
[[1.,2.,3.],[4.,5.,6.]] # 这个tensor的rank 为2 并且 shape 为 [2, 3]
[[[1.,2.,3.]],[[7.,8.,9.]]] # 这个tensor的rank 为3 并且 shape 为 [2, 1, 3]
Operation: operation 计算的单元,在是computational graph 的 节点。
c = tf.matmul(a, b) # 创造了一个"MatMul" 类型的 Operation, 输入是a 和b 输出是 c
Session:
computational graph 必须在session中运行;
Session 是运行class的类, 一个 Session object 封装了computational graph的环境, Operation 的计算在这个环境中被执行,tensor 的结果在这个环境中被求出;
Naive实例
import tensorflow as tf
# build graph
node1 = tf.constant(3.0, tf.float32)
node2 = tf.constant(4.0) # also tf.float32 implicitly
node3 = tf.add(node1, node2)
# Launch the graph in a session.
sess=tf.Session()
# run the graph
print(sess.run(node3))
# release resource
sess.close()
上面的naive Example 展示了一个完整的tensorflow 程序的过程,但这个程序的输入输出都是常数,而外部输入和输出的形式各异,显然还需要有其它的概念加入才能满足需求。
Feeding 和 Placeholders
TensorFlow 的 feed 机制 使你能够将数据注入到computational graph 中的任意一个tensor 中去,这种机制主要借助于 placeholder 完成。
Placeholders :
是一种 operation,这种operation必须在被执行前feed 数据进去。
a = tf.placeholder(tf.float32)
b = tf.placeholder(tf.float32)
adder_node = a + b
with tf.Session() as sess:
print(sess.run(adder_node,{a:3, b:4.5}))
print(sess.run(adder_node,{a:[1, 3], b:[2, 4]}))
上面的代码块第一第二行定义了两个placeholder操作,之后第5和第6行 分别利用feed 机制注入了 将 tensor 注入到了 a, 和 b
Variable :
主要是当做graph的一些可变参数,用来使得多次执行computational graph 时改变参数的状态;
W=tf.Variable([.3],tf.float32)
b=tf.Variable([-.3],tf.float32)
x=tf.placeholder(tf.float32)
linear_model=W*x+b
上面的代码定义了variable, 但没有初始化,在TensorFlow 程序中初始化所有的Variable必须调用一个特殊的operation , 具体如下:
init=tf.global_variables_initializer()
sess.run(init)
有了以上基础知识,下面利用完成一个简单的线下拟合模型的程序
线下拟合代码
import numpy as np
import tensorflow as tf
# Model parameters
W = tf.Variable([.3], tf.float32)
b = tf.Variable([-.3], tf.float32)
# Model input and output
x=tf.placeholder(tf.float32)
linear_model=W*x+b
y=tf.placeholder(tf.float32)
# loss
loss=tf.reduce_sum(tf.square(linear_model-y))# sum of the squares
# optimizer
optimizer=tf.train.GradientDescentOptimizer(0.01)
train=optimizer.minimize(loss)
# training data
x_train = [1, 2, 3, 4]
y_train = [0, -1, -2, -3]
# training loop
init = tf.global_variables_initializer()
sess=tf.Session()
sess.run(init)# reset values to wrong
for i in range(1000):
sess.run(train,{x:x_train,y:y_train})
# evaluate training accuracy
curr_W,curr_b,curr_loss=sess.run([W,b,loss],{x:x_train,y:y_train})
print("W: %s b: %s loss: %s"%(curr_W, curr_b, curr_loss))
上面代码可以在tensorboard 生成如下的图:
![Paste_Image.png](https://www.tensorflow.org/images/getting_started_final.png)
总结
本文主要介绍了tensorflow的一些发展历史以及现状
核心基础概念:
graph
tensor
operation
session
palaceholder
variable
最后以一个简单的实例结束了本小节