TensorFlow使用图(graph)表示计算任务,图中的节点被称为op。一个Tensor一般为一个类型化的多维数组,一个op获得零个或多个数据(Tensor)后,在会话(session)的上下文(context)中将图的op分发给CPU或GPU,同时提供执行op的方法执行计算,结果产生零个或多个Tensor。使用Variable表示变量,用来维护状态。Fetch取回操作的输出内容,Feed可以对图中任意op操作直接插入一个tensor替换图中原有操作。
节点(operation)
节点被称之为op(节点也叫操作、算子,是operation的缩写)。一个op获得0个或多个tensor,执行计算产生0个或多个tensor
张量数据(tensor)
TensorFlow,字面意思就是张量的流动(flow),即保持计算节点不变,让数据进行流动。tensor是一个数据类型是一个多维数组
图(graph)
节点和边相互连接成计算图,一个计算图描述了一次计算过程。
会话(session)
计算图必须在会话里被启动。会话将计算图的op分发到诸如CPU或GPU之类的设备上,同时提供执行op的方法。这些方法执行后,将产生的tensor返回。
在Python语言中, 返回的tensor是numpy ndarray对象;
在C和C++语言中,返回的tensor是tensorflow Tensor实例。
详细说明
构建图
构建图的第一步, 是创建源 op (source op). 源 op 不需要任何输入, 例如 常量 (Constant). 源 op 的输出被传递给其它 op 做运算。
import tensorflow as tf
# ---------------- 构建图 ----------------
# 1*2常量矩阵op
matrix1 = tf.constant([[3., 3.]])
# 2*1常量矩阵op
matrix2 = tf.constant([[2.], [2.]])
# matmul矩阵乘法op
product = tf.matmul(matrix1, matrix2)
启动图
图的启动只能在Session
中启动计算,无任何创建参数, 会话构造器将启动默认图。tf.device("/gpu:1")
用于指派使用GPU进行计算。
# ---------------- 启动图 ----------------
# 会话session启动
sess = tf.Session(config=tf.ConfigProto(log_device_placement=True))
result = sess.run(product)
print(result)
# 任务完成关闭会话
sess.close()
Session 对象在使用完后需要关闭以释放资源. 除了显式调用 close 外, 也可以使用 "with" 代码块 来自动完成关闭动作.
with tf.Session() as sess:
result = sess.run([product])
print result
数据类型和操作
张量-Tensor
张量tensor是一个n维的数组或列表,有一个静态类型和动态类型的维数。张量可以在图中的节点之间流通。
TensorFlow 文件编制中通过三种符号约定来描述张量维度(Shape):阶,形状和维数。
张量的阶:与矩阵的阶不同,张量的阶仅是张量维数的一个数量描述。
0阶 -> 纯量(常量数字,只有大小) -> a = 483
1阶 -> 向量(线,有大小和方向) -> b = [1, 2, 3]
2阶 -> 矩阵(二维平面,数据表,矩阵) -> c = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
3阶 -> 立体(三维数据,立方矩阵) -> [[[1], [2], [3]], [[4], [5], [6]], [[7], [8], [9]]]
更高阶…
张量的形状:张量的形状是每个维度中元素的数量。TensorFlow 在图的构建过程中自动推理形状。这些推理的形状可能具有已知或未知的阶。如果阶已知,则每个维度的大小可能已知或未知。
张量的数据类型
数据类型 | Python类型 | 描述 |
---|---|---|
DT_FLOAT | tf.float32 | 32位浮点数 |
DT_DOUBLE | tf.float64 | 64位浮点数 |
DT_INT8 | tf.int8 | 8位有符号整形 |
DT_INT16 | tf.int16 | 16位有符号整形 |
DT_INT32 | tf.int32 | 32位有符号整形 |
DT_INT64 | tf.int64 | 64位有符号整形 |
DT_UINT8 | tf.uint8 | 8位无符号整形 |
DT_STRING | tf.string | 可变程度的字节数组,每一个张量元素都是一个字节数组 |
DT_BOOL | tf.bool | 布尔型 |
DT_COMPLEX64 | tf.complex64 | 复数: 由两个32位浮点数组成 |
DT_QINT8 | tf.qint8 | 用于量化Ops的8位有符号整形 |
DT_QINT32 | tf.qint32 | 用于量化Ops的32位有符号整形 |
DT_QUINT8 | tf.quint8 | 用于量化Ops的8位无符号整形 |
变量-Variables
创建一个变量tf.Variable
,变量维护图执行过程中的状态信息,tf.assign
真正执行赋值操作
# 创建一个变量并初始化为标量 0
state = tf.Variable(0, name="counter")
one = tf.constant(1)
new_value = tf.add(state, one)
update = tf.assign(state, new_value)
init = tf.initialize_all_variables()
with tf.Session() as _sess:
_sess.run(init)
print(_sess.run(state))
for _ in range(3):
_sess.run(update)
print(_sess.run(state))
Fetch
取回操作的输出内容
input1 = tf.constant(3.0)
input2 = tf.constant(2.0)
input3 = tf.constant(5.0)
intermed = tf.add(input2, input3)
mul = tf.multiply(input1, intermed)
with tf.Session() as sess:
result = sess.run([mul, intermed])
print(result)
Feed
feed 机制可以临时替代图中的任意操作中的 tensor 可以对图中任何操作提交补丁, 直接插入一个 tensor。feed 只在调用它的方法内有效, 方法结束, feed 就会消失。最常见的用例是使用 tf.placeholder() 为操作标记创建占位符
input4 = tf.placeholder(tf.float32)
input5 = tf.placeholder(tf.float32)
output = tf.add(input4, input5)
with tf.Session() as sess:
print(sess.run([output], feed_dict={input4: [7.], input5:[2.]}))
常见错误
-
module 'tensorflow' has no attribute
如果你是参考TensorFlow中文社区的学习教程,一定是你经常看到的错误,原因是新版本的TensorFlow修改了许多函数的名字,本文示例已经修正,不完全整理如下
tf.sub()更改为tf.subtract()
tf.mul()更改为tf.multiply()
tf.types.float32更改为tf.float32
tf.pact()更改为tf.stact()
网友评论