以前一直想用下TensorFlow,但一直没有时间学习,现在终于空闲一点了,可以好好的研究下TensorFlow了。
我自己以前一直用的是theano,以及基于theano的一个框架Lasagne。这几天体验了下TensorFlow,发现TensorFlow和theano其实有很多相似性,所以TensorFlow还是蛮好上手的。记录一下学习的过程
一 TensorFlow是什么
我们先来对tensorflow有个总体的印象吧,下面一段是我从百度上抄的:
TensorFlow是谷歌基于DistBelief进行研发的第二代人工智能学习系统,其命名来源于本身的运行原理。Tensor(张量)意味着N维数组,Flow(流)意味着基于数据流图的计算,TensorFlow为张量从流图的一端流动到另一端计算过程。TensorFlow是将复杂的数据结构传输至人工智能神经网中进行分析和处理过程的系统。
TensorFlow可被用于语音识别或图像识别等多项机器深度学习领域,对2011年开发的深度学习基础架构DistBelief进行了各方面的改进,它可在小到一部智能手机、大到数千台数据中心服务器的各种设备上运行。TensorFlow将完全开源,任何人都可以用。
简单的说TensorFlow就是谷歌开发的深度学习的框架,你能够基于它快速的搭建一些深度学习模型(当然也能搭建其他机器学习模型~~)。
另外,上面提到数据流图,这是TensorFlow里面一个比较重要的概念,所以接下来会稍微详细的介绍一下数据流图以及与之相关的一些概念:
数据流图结构
在TensorFlow中,机器学习会表示成计算图。一个计算图或者说数据流图是一个有向图(学过图论的小伙伴都知道这个概念吧,没学过也别怕,不影响阅读),在这个有向图中,点代表了一个操作,边代表了数据流。例如输出变量z是对两个输入变量x和y做运算的结果,则我们绘制从节点x和节点y到节点z的有向图,并用所采用的运算操作注释该节点,计算图的示例在下图中给出。
下面简单介绍下数据流图的主要元素,即操作,张量,变量和会话。
操作(operations):在TensorFlow中,操作(operations)就是对计算图中各种数据流的一些运算转换等,常用操作如下图:
张量(tensors):在TensorFlow中,边表示从一个操作到另一个操作的数据流,用张量来表示(可能不好理解,先不用管这个)。简单的理解就是,张量是一个多维数组,例如矩阵是二维的,张量可以表示更高维的。
变量(variables):变量和张量可能容易混淆,可以把变量想成特殊的张量,例如模型中的参数需要保存下来,就可以把参数用变量来表示。为了操纵和更新变量,TensorFlow提供了assign等操作。
会话(sessions):在TensorFlow中,通过一个Session来启动图,进行相关计算。
二 一个小例子
下面我们通过一个非常简单的官方小例子来感受下TensorFlow以及上面提到一些概念
这段代码中,首先生成一些三维数据,然后用一个平面拟合它
import tensorflow as tf
import numpy as np
# Create 100 phony x, y data points in NumPy, y = x * 0.1 + 0.3
x_data = np.random.rand(100).astype(np.float32)
y_data = x_data * 0.1 + 0.3
首先随机生成100个数,作为x,然后根据代码中的公式得到y(这就是我们的训练集了哦)
# 构造一个线性模型
b = tf.Variable(tf.zeros([1]))#变量
W = tf.Variable(tf.random_uniform([1, 2], -1.0, 1.0))#变量
y = tf.matmul(W, x_data) + b#上节提到的操作
我们这就够造好里一个机器学习模型里,是不是很简单。注意,上面的b和W就是模型的参数,我们用了上一节提到的变量来表示。
# 最小化方差
loss = tf.reduce_mean(tf.square(y - y_data))#损失函数
optimizer = tf.train.GradientDescentOptimizer(0.5)
train = optimizer.minimize(loss)#优化的目标就是最小化损失函数
这一段代码在构造我们的损失函数,并且在训练的过程中最小化损失函数
# 初始化变量
init = tf.initialize_all_variables()
# 启动图 (graph)
sess = tf.Session()
sess.run(init)
这里是上一节提到的Session,我们通过Session来启动一个图
# 拟合平面
for step in xrange(0, 201):
sess.run(train)
if step % 20 == 0:
print step, sess.run(W), sess.run(b)
# 得到最佳拟合结果 W: [[0.100 0.200]], b: [0.300]
这一步就是我们的训练步骤了
这个例子就完成了,虽然非常的简单,也没有太多的实用生产价值,但是我们能够大致的来感受下TensorFlow了,同时,很多时候机器学习的大致套路也和上面的简单例子差不多了,先构建好我们的模型(例子中y = tf.matmul(W, x_data) + b),定义需要优化的损失函数(例子中采用的最小化方差),确定好优化求解方法(例子中采用的梯度下降),然后在实际数据上不断迭代,当然在真实的环境中里面的每一步都不会这样的简单啦。
好了,先写到这了,以后接着写。
参考:
https://www.tensorflow.org/get_started/
http://baike.baidu.com/item/TensorFlow
https://arxiv.org/abs/1610.01178