引言
2015年11月9日,Google发布人工智能系统TensorFlow并宣布开源.Tensor(张量)意味着N维数组,Flow(流)意味着基于数据流图的计算,TensorFlow为张量从流图的一端流动到另一端计算过程。TensorFlow是将复杂的数据结构传输至人工智能神经网中进行分析和处理过程的系统。
TensorFlow可被用于语音识别或图像识别等多项机器深度学习领域,对2011年开发的深度学习基础架构DistBelief进行了各方面的改进,TensorFlow支持各种异构的平台,支持多CPU/GPU,服务器,移动设备,具有良好的跨平台的特性;TensorFlow架构灵活,能够支持各种网络模型,具有良好的通用性。
架构简介
TensorFlow的系统结构以C API为界,将整个系统分为前端和后端两个子系统:
前端系统:提供编程模型,负责构造计算图;
后端系统:提供运行时环境,负责执行计算图。
? 计算图
Tensorflow采用数据流计算,其表达的数据流计算由一个节点集合组成。图中的每个节点有一个或多个输入和零个或多个输出。图中的叶子节点表示常量或变量。图中的非叶子节点表示一种操作。其中箭头方向表示张量的流动方向。
? 技术栈
名词概念
? Tensor
TensorFlow程序使用tensor数据结构来代表所有的数据,计算图中,操作间传递的数据都是 tensor. 你可以把 TensorFlow tensor看作是一个n维的数组或列表.一个tensor 包含一个静态类型rank,和一个shape.
? tf.Graph
把运算任务描述成一个直接的无环图形(DAG),图表中的节点(node)代表必须要实现的一些操作。图中的边代表数据或者可控的依赖。GratheDef 是系统中描述一个图表的协议(api),它由一个 NodeDefs 集合组成。一个GraphDef可以转化成一个更容易操作的图表对象。
在 TensorFlow 中的每一个计算都表示为数据流图,这个图有两类元素:
一类 tf.Operation,表示计算单元
一类 tf.Tensor,表示数据单元
? tf.Session
tf.Session 对象封装了 Operation 对象的执行环境。Tensor 对象是被计算过的(从文档中)。为了做到这些,我们需要在 Session 中定义哪个图将被使用到:
import tensorflow as tf
my_graph = tf.Graph()
with tf.Session(graph=my_graph) as sess:
x = tf.constant([1,3,6])
y = tf.constant([1,1,1])
op = tf.add(x,y)
为了执行操作,你需要使用方法 tf.Session.run()。这个方法通过运行必要的图段去执行每个 Operation 对象并通过参数 fetches 计算每一个 Tensor 的值的方式执行 TensorFlow 计算的一'步':
? tf.Variable
权重和误差存储在变量(tf.Variable)中。这些变量通过调用 run() 保持在图中的状态。在机器学习中我们一般通过正态分布来启动权重和偏差值。
weights = {
'h1': tf.Variable(tf.random_normal([n_input, n_hidden_1])),
'h2': tf.Variable(tf.random_normal([n_hidden_1, n_hidden_2])),
'out': tf.Variable(tf.random_normal([n_hidden_2, n_classes]))
}
biases = {
'b1': tf.Variable(tf.random_normal([n_hidden_1])),
'b2': tf.Variable(tf.random_normal([n_hidden_2])),
'out': tf.Variable(tf.random_normal([n_classes]))
}
安装
笔者采用pip安装方式,具体可参考官方文档(https://www.tensorflow.org/install/ #pip-installation),方法很多不再赘述。安装过程出现一个小插曲,有遇到这个错误“TensorFlow import error: no module named _pywrap_tensorflow”。笔者查阅资料后从https://www.microsoft.com/en-us/download/details.aspx?id=53587下载Visual C++ Redistributable 2015 x64 安装后解决,仅供参考。
基本开发流程
? 创建常量和变量
? 创建操作节点
? 创建初始化节点
? 启动图
? 变量初始化
? 运行操作节点
? 更新变量值
执行计算操作之前需要将图构建完成,创建图的最后阶段需要向图中添加一个初始化操作的节点。启动图的第一步是创建一个session对象,如果没有创建参数,session构造器将启动默认图。
import numpy as np
import tensorflow as tf
# Model parameters
W = tf.Variable([.3], dtype=tf.float32)
b = tf.Variable([-.3], dtype=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))
上图是一个简单的示例,利用Tensorflow提供的API比较简单的实现了一个线性回归的模型,代码还是比较简洁易懂的。Tensorflow在tf.train API下提供了很多优化器来最小化损失函数,上图示例中使用的最简单梯度下降法GradientDescentOptimizer。代码函数的具体含义可以参考官网的API(https://www.tensorflow.org/api_docs/)。
结语
目前神经网络等技术广泛应用于学界和工业界,Tensorflow的出现使得建模、编程的效率大大提高。基于此,本文简单介绍了TensorFlow的基本概念及流程,希望起到抛砖引玉的作用,如有不足烦请指正。
参考文献:
[1] Manevitz L M, Yousef M. One-class svms for document classification[J]. Journal of Machine Learning Research, 2002, 2(1):139-154
[2]https://github.com/aymericdamien/TensorFlow-Examples/blob/master/examples/3_NeuralNetworks
[3] https://www.tensorflow.org/