张量(tensor)是什么?
tensorflow对张量(Tensor)是这样定义的:
张量是对矢量和矩阵向潜在的更高维度的泛化。TensorFlow 在内部将张量表示为基本数据类型的 n 维数组。
显然,tensorflow将张量定义为多维数组。它可以表示任意维度的数组,维度用rank(阶)表示。它在深度学习中存在的意义是创造更高维度的矩阵、向量。
借用知乎【马同学】的图片,我们可以形象的认识张量
把3阶张量画为一个立方体
我们就可以进一步地画出更高维的张量
0阶张量——点
1阶张量——线
2阶张量——面
3阶张量——体
再把3阶张量当成一个点,则可以进一步描绘出4阶张量——线,依此类推。
张量有什么用?
举个简单的例子,一个彩色图像文件(RGB)一般会被处理为3阶tensor,每个二维数组中的元素为一个像素,每个像素包含数值R、G、B。
但在机器学习工作中,我们经常要处理不止一张图片,我们要处理的是一个集合。这意味着,3d-tensor无法满足我们的需求,我们需要一个4d-tensor,4阶张量!它存储了一定数量的彩色图片!
计算图The Computational Graph
计算图是由计算节点(node)构成的图。节点node代表一种运算操作,如加法操作Add等,输入大于等于0个张量,输出一个张量。
tensorflow = tensor(张量) + flow(流动)=> tensorflow的计算图每个节点的输入输出都是tensor,而连接节点的有向线段就是flow,表示从一个tensor状态到另一个tensor状态。
这边再看一个简单的代码
代码分为三个部分:
- 导入语句
- 构建计算图,构建计算图后,直接打印node3,得到的是该节点的相关信息,计算没有执行
- 运行计算图,使用sess.run()才能运行计算图,得到该节点运算结果。
示例代码中,计算图构建完成后,最后让计算图执行运算的是Session的Run方法。Session封装了对TensorFlow运行时的控制,及其状态,为用户提供了交互的接口。
其他类型的节点
- 占位节点(tf.placeholder)
占位节点,在构建计算图阶段先定义节点(只需定义类型),运行计算图时必须提供节点的值。
a = tf.placeholder(tf.float32)
b = tf.placeholder(tf.float32)
adder_node = a + b
print(sess.run(adder_node, {a: 3, b:4.5}))
print(sess.run(adder_node, {a: [1,3], b: [2, 4]}))
程序输出
7.5
[ 3. 7.]
ps: 占位节点只负责占位,但是无记忆,运行计算图提供的值是临时性的
- 变量节点(tf.Variable)
比占位节点更加灵活的、即可以动态修改、又具有记忆的节点是变量节点。使用时需要提供初始值和变量类型。tf.assign可以动态改变变量节点的值,但需要sess.run完成赋值。
W = tf.Variable([.3], tf.float32)
b = tf.Variable([-.3], tf.float32)
x = tf.placeholder(tf.float32)
linear_model = W * x + b
sess.run(tf.global_variables_initializer()) # 在训练开始前一次性初始化所有可训练变量
print(sess.run(linear_model, {x:[1,2,3,4]}))
fixW = tf.assign(W, [-1.])
fixb = tf.assign(b, [1.])
sess.run([fixW, fixb])
print(sess.run(linear_model, {x:[1,2,3,4]}))
【相关资料】
TensorFlow从0到1 - 2 - TensorFlow核心编程
笔记 | 什么是张量(tensor)& 深度学习
什么是张量(tensor)?
【深度学习-2】TensorFlow基础(一): tensor and operation
浅谈什么是张量tensor
tensorflow对张量的定义