admin 管理员组

文章数量: 888297

tensor的storage(),stride(),storage

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()012345
>>> 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()012345
>>> 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()012395
[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()012395
[torch.LongStorage of size 6]
>>> c
tensor([2, 3, 9, 5])
>>> c.storage_offset()
2

  c的的第一个元素为2,而2是c的storage的第2位,所以偏移量为2。

本文标签: tensor的storage() stride() storage