Obwohl beide torch.view
und torch.reshape
zur Umformung von Tensoren verwendet werden, sind hier die Unterschiede zwischen ihnen.
- Wie der Name schon sagt, wird
torch.view
lediglich eine Ansicht des ursprünglichen Tensors erstellt. Der neue Tensor wird immer seine Daten mit der Original - Tensor teilen. Dies bedeutet, dass sich der umgeformte Tensor ändert, wenn Sie den ursprünglichen Tensor ändern, und umgekehrt.
>>> z = torch.zeros(3, 2)
>>> x = z.view(2, 3)
>>> z.fill_(1)
>>> x
tensor([[1., 1., 1.],
[1., 1., 1.]])
- Um sicherzustellen, dass der neue Tensor seine Daten immer mit dem Original teilt, werden
torch.view
den Formen der beiden Tensoren einige Kontiguitätsbeschränkungen auferlegt [ docs ]. Meistens ist dies kein Problem, torch.view
wirft aber manchmal einen Fehler aus, selbst wenn die Formen der beiden Tensoren kompatibel sind. Hier ist ein berühmtes Gegenbeispiel.
>>> z = torch.zeros(3, 2)
>>> y = z.t()
>>> y.size()
torch.Size([2, 3])
>>> y.view(6)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
RuntimeError: invalid argument 2: view size is not compatible with input tensor's
size and stride (at least one dimension spans across two contiguous subspaces).
Call .contiguous() before .view().
torch.reshape
legt keine Kontiguitätsbeschränkungen fest, garantiert aber auch nicht den Datenaustausch. Der neue Tensor kann eine Ansicht des ursprünglichen Tensors sein, oder er kann insgesamt ein neuer Tensor sein.
>>> z = torch.zeros(3, 2)
>>> y = z.reshape(6)
>>> x = z.t().reshape(6)
>>> z.fill_(1)
tensor([[1., 1.],
[1., 1.],
[1., 1.]])
>>> y
tensor([1., 1., 1., 1., 1., 1.])
>>> x
tensor([0., 0., 0., 0., 0., 0.])
TL; DR:
Wenn Sie nur Tensoren umformen möchten, verwenden Sie torch.reshape
. Wenn Sie auch Bedenken hinsichtlich der Speichernutzung haben und sicherstellen möchten, dass die beiden Tensoren dieselben Daten verwenden, verwenden Sie torch.view
.