在深度学习中经常会碰到一个词,“张量”(tensor)。但对于一维,二维,三维还好理解,那么更多维度的时候呢?特别是当增加了批次(batch_size)这个维度,我们应该如何理解张量。
以pytorch为例,tensorflow也是一样的。
我们先来看这几个维度:
一维:
a = torch.tensor([1,2,3])
输出:tensor([1, 2, 3])
shape:torch.Size([3])
输出只有一个维度,所以是一维
二维:
a = torch.tensor([[1,2,3]])
输出:tensor([[1, 2, 3]])
shape:torch.Size([1, 3])
a = torch.tensor([[1,2,3],[4,5,6],[7,8,9]])
tensor([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
shape:torch.Size([3, 3])
以上输出有行和列,所以上二维张量,就是一个二维矩阵。
在来看一个矩阵:
torch.ones(1,3,3)
tensor([[[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]]])
我们注意到这个张量是有三个维度的,前面多了一个维度1。但貌似没看出这个1体现在哪里,我们再来看一个张量,进一步看一下这个最前面的维度体现在哪里:
torch.ones(3,3,3)
tensor([[[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]],
[[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]],
[[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]]])
这回能看出来这个最前面的维度体现在哪里了么?相当于第一个3,是分了3大行,每一大行,又分了三行小行,每行又分了三列,所以是3*3*3,最后一个维度永远是列的维度。
如果你将上面的张量类比成图像,就相当于上面是3通道,每个通道的大小又是三行三列。。。
然后我们在看一个张量:
torch.ones(2,3,3,3)
tensor([[[[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]],
[[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]],
[[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]]],
[[[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]],
[[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]],
[[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]]]])
上面的输出我专门用一个水平线分开了,这样更明显,上面一部分是一个维度,下面又是一个维度,所以是两个维度,再说的大白话点,就是整个张量,两大行,每大行又分了三行,每行又分了三行,然后又分了三列。
这个最前面的维度2,其实就是batchsize,就相当于这个张量是输入了两张图像,每个图像的大小是3通道,大小3*3。这样就应该比较好理解了。
再附一张图来说明一下:
希望能够说明白~~让大家更好的理解张量