Хотя оба torch.view
и torch.reshape
используются для изменения формы тензоров, вот различия между ними.
- Как следует из названия,
torch.view
просто создает вид исходного тензора. Новый тензор всегда будет делиться своими данными с исходным тензором. Это означает, что если вы измените исходный тензор, измененный тензор изменится, и наоборот.
>>> z = torch.zeros(3, 2)
>>> x = z.view(2, 3)
>>> z.fill_(1)
>>> x
tensor([[1., 1., 1.],
[1., 1., 1.]])
- Чтобы гарантировать, что новый тензор всегда делится своими данными с исходным,
torch.view
налагает некоторые ограничения смежности на формы двух тензоров [ docs ]. Чаще всего это не вызывает беспокойства, но иногда torch.view
вызывает ошибку, даже если формы двух тензоров совместимы. Вот известный контрпример.
>>> 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
не накладывает никаких ограничений на смежность, но также не гарантирует совместное использование данных. Новый тензор может быть представлением исходного тензора или может быть совершенно новым тензором.
>>> 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:
Если вы просто хотите изменить форму тензоров, используйте torch.reshape
. Если вас также беспокоит использование памяти и вы хотите, чтобы два тензора использовали одни и те же данные, используйте torch.view
.