Хотя оба 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.