参照网页: 张量(tensor)是什么?
整理
1.什么是张量(tensor)
深度学习框架中的一个核心组件,后续的所有运算和优化算法几乎都是基于张量进行的。
理解张量,先从最简单的标量开始。
标量(scalar):一个标量就是一个单独的数,一般用小写的的变量名称表示,可以把标量看成零维数组。
向量(vector):又叫矢量,既有大小,又有方向,可以把向量看成一维数组。
矩阵(matrix):是一个二维数组。拆开来看,矩阵是一组行向量,或一组列向量的组合,向量里每个元素右是标量的组合。
张量(tensor):简单理解张量,就是向量和矩阵的扩展。
通俗一点理解的话,我们可以将标量视为零阶张量,向量视为一阶张量,那么矩阵就是二阶张量。
三阶张量就是一个三维数组,比如用一个三维数组表示图片,第一维是长度,第二维是宽度,第三维是颜色。
还可以增加一个维度,比如编号,这样就成了四维数组,就可以说是一个四阶张量。
简单理解张量,它就是一个大于等于3维的数组。
2.如何理解多维张量
0、零维张量
import tensorflow as tf
#零维张量
const0 = tf.constant(1, tf.float16)
print(const0)
运行结果:
Tensor("Const:0", shape=(), dtype=float16)
1、一维张量
#一维张量,长度为4
const1 = tf.constant([1, 2, 3, 4], tf.float16)
print(const1)
运行结果:
Tensor("Const_1:0", shape=(4,), dtype=float16)
几何表示:
一维张量没有行和列的概念,只有长度的概念。
上述的const1
就是长度为4的一维张量,或者称为向量。
上面的图仅为示意,代表一维张量只有axis=0
这个方向,并不是指这是一个4行的向量。
事实上,tensorflow
在做一些运算时,反而经常把1行N列的二维张量简化成一个长度为N的一维向量。
2、二维张量
#二维张量,3行4列
const2 = tf.constant([
[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12]
], tf.float16)
print(const2)
运行结果:
Tensor("Const_2:0", shape=(3, 4), dtype=float16)
几何表示:
3、三维张量
#三维张量,3行4列深度为2的张量
const3 = tf.constant([
[[ 1, 2], [ 3, 4], [ 5, 6], [ 7, 8]],
[[11, 12], [13, 14], [15, 16], [17, 18]],
[[21, 22], [23, 24], [25, 26], [27, 28]]
], tf.float16)
print(const3)
运行结果:
Tensor("Const_3:0", shape=(3, 4, 2), dtype=float16)
几何表示:
4、四维张量(图像仅用于理解,坐标系axis已经不再适用)
#四维张量
const4 = tf.constant([
#第一个3行4列深度为2的三维张量
[[[1, 2], [ 3, 4], [ 5, 6], [ 7, 8]],
[[11, 12], [13, 14], [15, 16], [17, 18]],
[[21, 22], [23, 24], [25, 26], [27, 28]]
],
#第二个3行4列深度为2的三维张量
[[[1, 2], [ 3, 4], [ 5, 6], [ 7, 8]],
[[11, 12], [13, 14], [15, 16], [17, 18]],
[[21, 22], [23, 24], [25, 26], [27, 28]]]
], tf.float16)
print(const4)
运行结果:
Tensor("Const_4:0", shape=(2, 3, 4, 2), dtype=float16)
几何表示:
这个图上的axis不对,行应为axis=1,以此类推
如何判断一个张量的batch数、行、列、深度:
const4 = tf.constant([
#第一个3行4列深度为2的三维张量
[[[1, 2], [ 3, 4], [ 5, 6], [ 7, 8]],
[[11, 12], [13, 14], [15, 16], [17, 18]],
[[21, 22], [23, 24], [25, 26], [27, 28]]
],
#第二个3行4列深度为2的三维张量
[[[1, 2], [ 3, 4], [ 5, 6], [ 7, 8]],
[[11, 12], [13, 14], [15, 16], [17, 18]],
[[21, 22], [23, 24], [25, 26], [27, 28]]]
], tf.float16)
从左边开始数连续
[
的数量,最多有X个[
说明是X维张量。上面的例子就是4维张量。
以三维以上的张量为例:
从左边开始数连续的[
,最后一个[
对应的]
中一共两个元素,分别为1, 2,说明深度为2。
接下来向左边数上一级[
对应的]
中一共有4个元素[1, 2], [ 3, 4], [ 5, 6], [ 7, 8],说明列为4。
同理继续数上一级,得到3行,2个batch。
shape属性中的元素大于等于3时,可以用3维空间来理解。
shape=(3, 4, 2)时,表示3行4列深度为2的张量
shape=(2, 3, 4, 2)时,表示有2个 3行4列深度为2的张量
shape=(6, 2, 3, 4, 2)时,表示有6个四维张量,这个四维张量又可以表示为2个 3行4列深度为2的张量。
shape中的属性分别与axis=0
,axis=1
、axis=2
、axis=3
……对应,以此类推。
当维度超过3时,上图几何中的坐标系表示就已经错误了。但是对于理解多维是有帮助的。
3.张量如何reshape
将张量reshape为深度为2的
import tensorflow as tf
t=[1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8]
with tf.Session() as sess:
print (sess.run(tf.reshape(t,[1,3,-1,2])))
结果:与第2部分讲解预期一样,按照数据顺序进行reshape
[[[[1 2]
[3 4]
[5 6]]
[[7 8]
[9 0]
[1 2]]
[[3 4]
[5 6]
[7 8]]]]
四维数组的理解,(batch_size,height,width,channel)四维图像可以看成多张图片。
在维度上,我们可以这样理解,进行记忆 三维和四维分别如下
在tensorflow中,有argmax argmin等函数可以用到axis 。在增加删除维度axis,都可以用到