Хоча обидва 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
.