1. storage()
pytorch中的一个tensor分为头信息区(Tensor)和存储区(Storage)
信息区主要保存着tensor的形状(size)、步长(stride)、数据类型(type)等信息。
而真正的数据则保存成连续数组,存储在存储区。
一般一个tensor都会有相对应的Storage,但也有另一种情况时多个tensor都对应着相同的一个Storage,这几个tensor只是头信息区不同。
>>> a = torch.arange(6)
>>> a
tensor([0, 1, 2, 3, 4, 5])
>>> a.storage()
0
1
2
3
4
5
>>> b = a.view(2,3)
>>> b
tensor([[0, 1, 2],
[3, 4, 5]])
>>> b.storage()
0
1
2
3
4
5
[torch.LongStorage of size 6]
>>> c = a[3:]
>>> c
tensor([3, 4, 5])
>>> c.storage()
0
1
2
3
4
5
>>> id(a.storage()) == id(b.storage()) == id(c.storage())
True
可以发现a、b、c这三个tensor的Storage都是一样的,而a、b、c这三个tensor只是因为它们的头信息区不同。
>>> a[4]=9
>>> a
tensor([0, 1, 2, 3, 9, 5])
>>> b
tensor([[0, 1, 2],
[3, 9, 5]])
>>> c
tensor([3, 9, 5])
所以一旦修改其中一个tensor的值。其它tensor也会跟着改变。
2. stride()
官方文档是这样描述的:stride是在指定维度dim中从一个元素跳到下一个元素所必需的步长。当没有参数传入时,返回所有步长的元组。否则,将返回一个整数值作为特定维度dim中的步长。
>>> b
tensor([[0, 1, 2],
[3, 9, 5]])
>>> b.stride()
(3, 1)
>>> b.stride(0)
3
>>> b.stride(1)
1
上面的3指的是第0个维度中的一个元素[0, 1, 2]到下一个元素[3, 9, 5]所需要的步长为3,也可以理解从第一个的第一个索引到下一个元素第一个索引跨度是3。而1指的是第1个维度[0, 1, 2]中的一个元素0到下一个元素1所需要的步长为1。
3. storage_offset()
返回tensor的第一个元素与storage的第一个元素的偏移量。
>>> b.storage()
0
1
2
3
9
5
[torch.LongStorage of size 6]
>>> b
tensor([[0, 1, 2],
[3, 9, 5]])
>>> b.storage_offset()
0
b的的第一个元素为0,而0是b的storage的第0位,所以偏移量为0。
>>> c.storage()
0
1
2
3
9
5
[torch.LongStorage of size 6]
>>> c
tensor([2, 3, 9, 5])
>>> c.storage_offset()
2
c的的第一个元素为2,而2是c的storage的第2位,所以偏移量为2。