Хоча обидва 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накладає певні обмеження на суміжність форм двох тензорів [ документи ]. Найчастіше це не турбує, але іноді 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.