tensor的storage(),stride(),storage_offset()

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。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值