内部结构
1.tensor分为头信息区(Tensor)和存储区(Storage);
信息区:tensor的形状(size)、步长(stride)、数据类型(type),信息区占用内存较少
存储区:数据保存为连续数组,主要内存占用在存储区
2.每一个tensor有着一个对应的storage,storage是在data之上封装的接口;
具体操作
- a = t.arange(0,6)
- a.storage()
- b = a.view(2,3)
- b.storage()
- #a和b的storage的内存地址一样,即他们是用同一个storage
- print( id(b.storage) == id(a.storage) )
- #a改变,b也随之改变,因为他们共享storage
- a[1] = 100
- print(b)
- c = a[2:]
- c.storage()
- print(c)
- #3198436924144 3198436924128,首地址差16,因为两个元素2*8,每个元素占8个字节
- print(c.data_ptr())
- print(a.data_ptr())
- c[0] = -100
- print(a)
- #3个tensor共享storage
- print(id( a.storage() ) == id( b.storage() ) == id( c.storage()) )
- #以储存元素的个数的形式返回tensor在地城内存中的偏移量
- print( a.storage_offset() )
- print( b.storage_offset() )
- print( c.storage_offset() )
- '''''0 0 2'''
- print('b',b)
- e = b[::1,::2]
- print('e',e)
- '''''b tensor([[ 0, 100, -100],
- [ 3, 4, 5]])
- e tensor([[ 0, -100],
- [ 3, 5]])'''
- #tensor步长
- print(b.stride(),e.stride())
- '''''(3, 1) (3, 2)'''
- #判断tensor是否连续
- print(e.is_contiguous())
- '''''False'''
- f = e.contiguous()
- print(f.is_contiguous())
- '''''True'''
总结
大部分操作并不修改tensor的数据,只修改了tensor的头信息,这种做法更节省内存,提升了处理速度。
注意:有些操作会导致tensor不连续,可以用tensor.contiguous方法将它们变成连续的数据。
2018-11-22 20:36:00