在不复制内存的情况下重复一个pytorch张量
Repeating a pytorch tensor without copying memory
pytorch
是否支持重复张量而不分配明显更多的内存?
假设我们有一个张量
t = torch.ones((1,1000,1000))
t10 = t.repeat(10,1,1)
重复t
10 次将需要占用 10 倍的内存。有没有一种方法可以在不分配更多内存的情况下创建张量 t10
?
Here 是一个相关问题,但没有答案。
您可以使用torch.expand
t = torch.ones((1, 1000, 1000))
t10 = t.expand(10, 1000, 1000)
请记住 t10
只是对 t
的引用。因此,例如,对 t10[0,0,0]
的更改将导致 t[0,0,0]
和 t10[:,0,0]
.
的每个成员发生相同的更改
除直接访问外,在 t10
上执行的大多数操作都会导致内存被复制,这会破坏引用并导致使用更多内存。例如:更改设备(.cpu()
、.to(device=...)
、.cuda()
),更改数据类型(.float()
、.long()
、.to(dtype=...)
),或使用 .contiguous()
.
pytorch
是否支持重复张量而不分配明显更多的内存?
假设我们有一个张量
t = torch.ones((1,1000,1000))
t10 = t.repeat(10,1,1)
重复t
10 次将需要占用 10 倍的内存。有没有一种方法可以在不分配更多内存的情况下创建张量 t10
?
Here 是一个相关问题,但没有答案。
您可以使用torch.expand
t = torch.ones((1, 1000, 1000))
t10 = t.expand(10, 1000, 1000)
请记住 t10
只是对 t
的引用。因此,例如,对 t10[0,0,0]
的更改将导致 t[0,0,0]
和 t10[:,0,0]
.
除直接访问外,在 t10
上执行的大多数操作都会导致内存被复制,这会破坏引用并导致使用更多内存。例如:更改设备(.cpu()
、.to(device=...)
、.cuda()
),更改数据类型(.float()
、.long()
、.to(dtype=...)
),或使用 .contiguous()
.