torch广播

1 torch 的转置 不会导致其内存空间不连续

a=t.arange(0,6)
a.storage()
 0
 1
 2
 3
 4
 5
[torch.LongStorage of size 6]
b=a.t()  # 进行转置的操作
print(b.is_contiguous())
b.storage()
True
 0
 1
 2
 3
 4
 5
[torch.LongStorage of size 6]

print(id(b.storage())==id(a.storage()))

得到的结果为True,可见a和b的storage存储地址一样的。共享storage

c=a[:2]
c.storage()
 0
 1
 2
 3
 4
 5
[torch.LongStorage of size 6]

可见此时的c和a是共享内存空间的。

c里面的是,

tensor([0, 1])

2 自动广播法则

  # 实现自动广播

a=t.ones(3,2)
b=t.zeros(2,3,1)
tensor([[[1., 1.],
         [1., 1.],
         [1., 1.]],

        [[1., 1.],
         [1., 1.],
         [1., 1.]]])

第一步:a是2维,b是三维。所以在较小的a前面补1

即 a.unsqueeze(0),a的形状变成(1,3,2),b的形状(2,3,1)

第二步:a和b在第一维和第三维的形状不一样,其中一个为1

可以利用广播法则扩展,两个形状都变成了(2,3,2)

 

expand重复数组,但不会复制数组,所以不会额外的占用空间。返回一个视图,对返回的张量不会分配新内存,返回张良内存是不连续的。

posted @ 2020-03-18 13:04  为红颜  阅读(369)  评论(0编辑  收藏  举报