Aunque ambos torch.view
y torch.reshape
se utilizan para remodelar tensores, aquí están las diferencias entre ellos.
- Como sugiere el nombre,
torch.view
simplemente crea una vista del tensor original. El nuevo tensor siempre compartirá sus datos con el tensor original. Esto significa que si cambia el tensor original, el tensor remodelado cambiará y viceversa.
>>> z = torch.zeros(3, 2)
>>> x = z.view(2, 3)
>>> z.fill_(1)
>>> x
tensor([[1., 1., 1.],
[1., 1., 1.]])
- Para asegurar que el nuevo tensor siempre comparta sus datos con el original,
torch.view
impone algunas restricciones de contigüidad en las formas de los dos tensores [ docs ]. La mayoría de las veces, esto no es un problema, pero a veces torch.view
arroja un error incluso si las formas de los dos tensores son compatibles. He aquí un famoso contraejemplo.
>>> 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
no impone restricciones de contigüidad, pero tampoco garantiza el intercambio de datos. El nuevo tensor puede ser una vista del tensor original o puede ser un nuevo tensor por completo.
>>> 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:
Si solo desea remodelar tensores, use torch.reshape
. Si también le preocupa el uso de la memoria y desea asegurarse de que los dos tensores compartan los mismos datos, utilice torch.view
.