Her ikisi de torch.view
ve torch.reshape
tensörleri yeniden şekillendirmek için kullanılsa da, aralarındaki farklar aşağıdadır.
- Adından da anlaşılacağı gibi,
torch.view
yalnızca orijinal tensörün bir görünümünü oluşturur . Yeni tensör , verilerini her zaman orijinal tensörle paylaşacaktır. Bu, orijinal tensörü değiştirirseniz, yeniden şekillendirilmiş tensörün değişeceği ve bunun tersi olacağı anlamına gelir.
>>> z = torch.zeros(3, 2)
>>> x = z.view(2, 3)
>>> z.fill_(1)
>>> x
tensor([[1., 1., 1.],
[1., 1., 1.]])
- Yeni tensörün verilerini her zaman orijinalle paylaştığından emin olmak için
torch.view
, iki tensörün [ docs ] şekillerine bazı bitişiklik kısıtlamaları getirir . Çoğu zaman bu bir sorun değildir, ancak bazen torch.view
iki tensörün şekilleri uyumlu olsa bile bir hata verir. İşte ünlü bir karşı örnek.
>>> 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
herhangi bir bitişiklik kısıtlaması getirmez, ancak veri paylaşımını da garanti etmez. Yeni tensör, orijinal tensörün bir görünümü olabilir veya tamamen yeni bir tensör olabilir.
>>> 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:
Sadece tensörleri yeniden şekillendirmek istiyorsanız kullanın torch.reshape
. Bellek kullanımı konusunda da endişeleriniz varsa ve iki tensörün aynı verileri paylaştığından emin olmak istiyorsanız, kullanın torch.view
.