Mặc dù cả hai torch.view
và torch.reshape
đều được sử dụng để định hình lại các tenxơ, nhưng đây là sự khác biệt giữa chúng.
- Như tên cho thấy,
torch.view
chỉ đơn thuần tạo ra một khung nhìn của tensor ban đầu. Tensor mới sẽ luôn chia sẻ dữ liệu của nó với tensor ban đầu. Điều này có nghĩa là nếu bạn thay đổi tensor ban đầu, tensor định hình lại sẽ thay đổi và ngược lại.
>>> z = torch.zeros(3, 2)
>>> x = z.view(2, 3)
>>> z.fill_(1)
>>> x
tensor([[1., 1., 1.],
[1., 1., 1.]])
- Để đảm bảo rằng tenxơ mới luôn chia sẻ dữ liệu của nó với dữ liệu ban đầu, hãy
torch.view
áp đặt một số ràng buộc về mặt tiếp giáp đối với hình dạng của hai tenxơ [ docs ]. Thông thường, điều này không đáng lo ngại, nhưng đôi khi gây torch.view
ra lỗi ngay cả khi hình dạng của hai bộ căng dây tương thích. Đây là một ví dụ phản bác nổi tiếng.
>>> 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
không áp đặt bất kỳ ràng buộc tiếp giáp nào, nhưng cũng không đảm bảo chia sẻ dữ liệu. Teo mới có thể là một hình chiếu của tensor ban đầu, hoặc nó có thể là một tensor mới hoàn toàn.
>>> 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:
Nếu bạn chỉ muốn định hình lại các tensor, hãy sử dụng torch.reshape
. Nếu bạn cũng lo lắng về việc sử dụng bộ nhớ và muốn đảm bảo rằng hai bộ căng chia sẻ cùng một dữ liệu, hãy sử dụng torch.view
.