这里先给出参考链接:
https://github.com/jikexueyuanwiki/tensorflow-zh/blob/master/SOURCE/get_started/basic_usage.md
blog.youkuaiyun.com/yhl_leo/article/details/50619029
www.tuicool.com/articles/aqAZviu
使用TensorFlow
,你必须明白TensorFlow
:
- 使用图
(graph)
来表示任务 - 被称之为会话
(Session)
的上下文(context)
中执行图 - 使用
tensor
表示数据 - 通过变量
(Variable)
维护状态 - 使用
feed
和fetch
可以为任意操作(arbitrary operation)
赋值或者从其中获取数据
1.TensorFLow图(graph)的概念:
Data Flow Graph: 使用有向图的节点和边共同描述数学计算。graph中的nodes代表数学操作,也可以表示数据输入输出的端点。边表示节点之间的关系,传递操作之间互相使用的多位数组(tensors,张量),tensor在graph中流动——这也就是TensorFlow名字的由来。一旦节点相连的边传来了数据流,节点就被分配到计算设备上异步的(节点间)、并行的(节点内)执行。参见上图。
请注意,tensoFlow是可以存在多张图的,但是默认情况下使用的是一张默认图,TensorFlow的op构造器可以为默认图添加结点。多图管理详见:
https://github.com/jikexueyuanwiki/tensorflow-zh/blob/master/SOURCE/api_docs/python/framework.md#Graph
op构造器形式如下:
# 构造器的返回值代表该常量 op 的返回值.
matrix1 = tf.constant([[3., 3.]])
# 创建另外一个常量 op, 产生一个 2x1 矩阵.
matrix2 = tf.constant([[2.],[2.]])
product = tf.matmul(matrix1, matrix2)
这里的product是矩阵乘运算结点。
2.会话session
session是graph的运行环境。启动默认图的方法是:
# 启动默认图. sess = tf.Session()如果想启动其他的图,需要在Session中填写相应的参数。
对于graph,如果我们想取回某个操作的结果,只需要使用:
result = sess.run(product)
print result
# 任务完成, 关闭会话.
sess.close()
这里的代码片是承接上文的。
sess.close()是用于释放资源的。当然,如果不想写sess.close(),也可以写成如下形式:
with tf.Session() as sess: result = sess.run([product]) print result
3.tensor变量
Tensorflow
使用tensor
数据结构来代表所有的数据,计算图中,操作间传递数据都是tensor
。你可以把Tensorflow
的tensor
看做是一个n
维的数组或列表。一个tensor
包含一个静态类型rank
和一个shape
。
在Tensorflow
系统中,张量的维数被描述为阶。但是张量的阶和矩阵的阶并不是同一个概念。张量的阶是张量维数的一个数量描述,下面的张量(使用python中list
定义的)就是2阶:
t = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
你可以认为一个二阶张量就是我们平常所说的矩阵,一阶张量可以认为是一个向量。对于一个二阶张量,你可以使用语句t[i, j]
来访问其中的任何元素。而对于三阶张量你可以通过t[i, j, k]
来访问任何元素:
阶 | 数学实例 | python例子 |
---|---|---|
0 | 纯量(只有大小) | s=483 |
1 | 向量(大小和方向) | v=[1.1, 2.2, 3.3] |
2 | 矩阵(数据表) | m=[[1, 2, 3], [4, 5, 6], [7, 8, 9]] |
3 | 3 阶张量 | t=[[[2], [4], [6]], [[8], [9], [10]], [[11], [12], [13]]] |
n | n 阶 | … |
形状
Tensorflow
文档中使用了三种记号来方便地描述张量的维度:阶,形状以及维数。以下展示了它们之间的关系:
阶 | 形状 | 维数 | 实例 |
---|---|---|---|
0 | [] | 0-D | 一个0维张量,一个纯量 |
1 | [D0] | 1-D | 一个1维张量的形式[5] |
2 | [D0, D1] | 2-D | 一个2维张量的形式[3, 4] |
3 | [D0, D1, D2] | 3-D | 一个3维张量的形式[1, 4, 3] |
n | [D0, D1, ... Dn] | n-D | 一个n维张量的形式[D0, D1, ..., Dn] |
数据类型
除了维度,tensor
有一个数据类型属性。你可以为一个张量指定下列数据类型中的任意一个类型:
数据类型 | python类型 | 描述 |
---|---|---|
DT_FLOAT | tf.float32 | 32位浮点数 |
DT_DOUBLE | tf.float64 | 64位浮点数 |
DT_INT64 | tf.int64 | 64位有符号整型 |
DT_INT32 | tf.int32 | 32位有符号整型 |
DF_INT16 | tf.int16 | 16位有符号整型 |
DT_INT8 | tf.int8 | 8位有符号整型 |
DT_UINT8 | tf.uint8 | 8位无符号整型 |
DT_STRING | tf.string | 可变长度的字节数组,每一个张量元素都是一个字节数组 |
DT_BOOL | tf.bool | 布尔型 |
DT_COMPLEX64 | tf.complex64 | 由32位浮点数组成的负数:实数和虚数 |
DT_QINT32 | tf.qint32 | 用于量化Ops的32位有符号整型 |
DT_QINT8 | tf.qint8 | 用于量化Ops的8位有符号整型 |
DT_QUINT8 | tf.quint8 | 用于量化Ops的8位无符号整型 |
tensor可以被声明为变量或常量。变量可以维护图运行过程中的状态信息,并且可以取回值。变量和常量的形式如下:
x = tf.Variable([1.0, 2.0]) a = tf.constant([3.0, 3.0])
取回变量或常量的值可以用:
res = sess.run(x) #or a
在tensorflow中,变量需要在被送入图中运行之前进行初始化,而常量不用。
初始化方法有单一初始化和全部初始化,分别如下:
# 使用初始化器 initializer op 的 run() 方法初始化 'x'
x.initializer.run()
#初始化默认图中的所有变量
init_op = tf.initialize_all_variables()
4.fetch和feed
Fetch
为了取回操作的输出内容, 可以在使用 Session
对象的 run()
调用 执行图时, 传入一些 tensor,这些 tensor 会帮助你取回结果. 在之前的例子里, 我们只取回了单个节点 state
, 但是你也可以取回多个tensor:
input1 = tf.constant(3.0)
input2 = tf.constant(2.0)
input3 = tf.constant(5.0)
intermed = tf.add(input2, input3)
mul = tf.mul(input1, intermed)
with tf.Session() as sess:
result = sess.run([mul, intermed])
print result
# 输出:
# [array([ 21.], dtype=float32), array([ 7.], dtype=float32)]
Feed
上述示例在计算图中引入了 tensor, 以常量或变量的形式存储. TensorFlow 还提供了 feed 机制, 该机制可以临时替代图中的任意操作中的 tensor 可以对图中任何操作提交补丁, 直接插入一个 tensor.
feed 使用一个 tensor 值临时替换一个操作的输出结果. 你可以提供 feed 数据作为 run()
调用的参数.feed 只在调用它的方法内有效, 方法结束, feed 就会消失. 最常见的用例是将某些特殊的操作指定为 "feed" 操作,标记的方法是使用 tf.placeholder() 为这些操作创建占位符.
input1 = tf.placeholder(tf.float32)
input2 = tf.placeholder(tf.float32)
output = tf.mul(input1, input2)
with tf.Session() as sess:
print sess.run([output], feed_dict={input1:[7.], input2:[2.]})
# 输出:
# [array([ 14.], dtype=float32)]
for a larger-scale example of feeds.如果没有正确提供 feed, placeholder()
操作将会产生错误.MNIST 全连通 feed 教程(source code)给出了一个更大规模的使用 feed 的例子.