尽管有一定的Python基础,但当我第一次接触TensorFlow(TF)的时候还是感觉很不习惯。所以,学习TF的第一步是用简单的例子(不涉及机器学习)搞清楚TF中的基本概念。
我在学习TensorFlow基础的时候,总结了以下2个目标:
- 能够熟练的使用Tensors,Graphs,Operations,Variables,placeholders,Sessions和name scopes来构建并运行简单的TensorFlow graphs
- 能够在TensorBoard中查看构建好的graphs
简介
TensorFlow,顾名思义就是流动着的Tensor。首先,我们要搞清楚什么是tensor,它在哪里以何种方式流动?用最简单的话来说,Tensor实际上就是一个多维数组(multidimensional array),是TF的主要数据结构。它们在一个或多个由节点(nodes)和边(edges)组成的图(graphs)中流动。边代表的是tensors,节点代表的是对tensors的操作(operations,or Ops for short)。tensors在图中从一个节点流向另一个节点,每次经过一个节点都会接受一次操作。
Tensor
我在用R编程的时候,大多数情况下处理的都是2维的表格,而学习TF的时候就要接触更高维的数据结构,所以最好能在头脑中想象出数据的形状,例如:
举个简单的例子,彩色图像文件(RGB)一般都会处理成3-d tensor,每个2d array中的element表示一个像素,R代表Red,G代表Green,B代表Blue:
创建tensor的方法可以分为2种,一种是用TF自带的一些函数直接创建,例如:
import tensorflow as tf
# create a zero filled tensor
tf.zeros([row_dim, col_dim])
# create a one filled tensor
tf.ones([row_dim, col_dim])
# create a constant filled tensor
tf.fill([row_dim, col_dim], 42)
# create a tensor out of an existing constant
tf.constant([1, 2, 3])
# generate random numbers from a uniform distribution
tf.random_uniform([row_dim, col_dim], minval=0, maxval=1)
# generate random numbers from a normal distribution
tf.random_normal([row_dim, col_dim], mean=0.0, stddev=1.0)
另一种是将Python对象(Numpy arrays, Python lists,Python scalars)转成tensor,例如:
import numpy as np
x_data = np.array([[1., 2., 3.], [3., 2., 6.]])
tf.convert_to_tensor(x_data, dtype=tf.float32)
Tensor对象有3个属性:
- rank:number of dimensions
- shape: number of rows and columns
- type: data type of tensor's elements
Operation
下面举一个简单的例子来说明tensor是如何在graph中流动的:
节点a接收了一个1-D tensor,该tensor从节点a流出后,分别流向了节点b和c,节点b执行的是prod操作(5*3),节点c执行的是sum操作(5+3)。当tensor从节点b流出时变成了15,从节点c流出时变成了8。此时,2个tensor又同时流入节点d,接受的是add操作(15+8),最后从节点d流出的tensor就是23。
用TF代码来创建上面的graph:
import tensorflow as tf
a = tf.constant([5, 3], name='input_a')
b = tf.reduce_prod(a, name='prod_b')
c = tf.reduce_sum(a, name='sum_c')
d = tf.add(b, c, name='add_d')
在上面的代码中,我们用不同的构造函数(constructor)定义了四个操作(对应图上4个节点)。例如,tf.constant()
创建的操作实际上就是一个“二传手”:接受一个tensor(或者一个list对象,自动将其转换成tensor对象),然后传给与它直接相连的下一个node。tf.reduce_prod()
和tf.reduce_sum()
操作可以把input tensor对象中的所有值相乘或相加,然后传递给下一个直接相连的node。
未完待续......