一. 什么是Tensor?
TensorFlow,是由Tensors组成的Data Flow Graphs。所以首先,需要明确的一点是,什么是Tensor? 如下图所示:
Multi-dimensional array就是所谓的Tensors。举个例子:
color image = 3rd-order tensor; 而Tensor的Rank指的就是Tensor的维度:
上图就是3D tensor of rank 3, 以下是程序表示:
3 # rank = 0;指的是标量
[1. ,2., 3.] # rank = 1;指的是向量vector
[[1., 2., 3.], [4., 5., 6.]] # rank = 2;指的是矩阵matrix
[[[1., 2., 3.]], [[7., 8., 9.]]] # rank >= 2 就没有自己的名称了
#### 总的来说,Tensor是Vector和Matrix等的泛化,只是用Rank来表示。
#### 反过来说,Vetcor和Matrix是Tensor中的特例
The central unit of data in TensorFlow is the
tensor. A tensor consists of a set of primitive values shaped into an array of any number of dimensions. A tensor’s
rank is its number of dimensions.
What makes a tensor a tensor is that when the basic vectors change, the components of the tensor would change in the same manner as they would in one of these objects.
一. 什么是TensorFlow:
TensorFlow是一个采用数据流图(Data Flow Graphs),用于数值计算的开源软件库。Tensors(张量)表示多维数据数组;Nodes(节点)在图中表示数学操作,数据的输入输出和读写操作;而edges(有向图的边),则表示节点之间的联系,主要负责传输多维数据数组Tensors。
从程序运行的角度来说,TensorFlow是一种将计算表示为图的编程系统。图中的Nodes称为ops(operations的简称),一个ops使用(>=0)个的Tensors,一个Tensors是一个多维数组。一个ops通过执行某些运算,产生0或以上个Tensors。
如下图所示:
上图表示的是Tensors从图中流过的直观图像。TensorFlow中的图描述了计算的过程。图中的edges可以输运“size可以动态调整” 的多维数组,即Tensors。一旦输入端的所有Tensors准备好,ops将被分配到各种计算设备中完成异步并行的运算。
二. TensorFlow的特征
- 高度的灵活性: 并不是一个严格的“神经网络”库。将计算表示为数据流图,就可以使用TensorFlow;
- 可移植性:CPU / GPU / Android / RasPi / Cloud;
- 将科研与产品联系:可以让应用型研究者将想法迅速运用到产品中;
- 自动求微分:基于梯度的机器学习算法会受益于TensorFlow。通过预定义预测模型,将结构和Objective function 结合在一起,并添加数据,TensorFlow就可以自动为你计算相关的微分导数;
- 多语言支持: C++/Python;
- 性能最优化:支持线程、队列、异步操作等。
三. 运行TensorFlow
- 使用graph来表示计算任务
- 在Session的context中执行图
- 使用Tensor表示数据
- 通过Variable维护状态
- 使用feed和fetch可以为人协议操作赋值或者获取数据
TensorFlow 程序通常被组织成一个构建阶段和一个执行阶段. 在构建阶段, op 的执行步骤被描述成一个图。在执行阶段,使用会话执行执行图中的 op。
接下来,我们基于tensorflow实现一个简单的linear regression的例子,代码如下:
import os
os.environ['TF_CPP_MIN_LOG_LEVEL']='2'
import tensorflow as tf
W = tf.Variable([.3], dtype=tf.float32)
b = tf.Variable([-.3], dtype=tf.float32)
x = tf.placeholder(tf.float32)
y = tf.placeholder(tf.float32)
linear_model = W * x + b
squared_deltas = tf.square(linear_model - y)
loss = tf.reduce_sum(squared_deltas)
init = tf.global_variables_initializer()
optimizer = tf.train.GradientDescentOptimizer(0.01)
train = optimizer.minimize(loss)
sess = tf.Session()
sess.run(init)
for i in range(1000):
sess.run(train, {x:[1,2,3,4], y:[0,-1,-2,-3]})
curr_W, curr_b, curr_loss = sess.run([W, b, loss], {x:[1,2,3,4], y:[0,-1,-2,-3]})
print("W: %s b: %s loss: %s"%(curr_W, curr_b, curr_loss))
程序输出如下: