Pytorch閱讀文檔之reshape,view,flatten, transpose函數

Pytorch閱讀文檔之reshape,view,flatten函數

flatten函數

之前寫過相關的文章,鏈接再此,對比總結會寫在最後,看官彆着急吼。

torch.reshape()函數

#reshape(*shape) → Tensor
#參數:
#shape (tuple of python:ints or int...) – 想要轉換的形狀
#返回具有與self相同的數據和元素數量但具有指定形狀的張量。
#如果shape與當前形狀兼容,則此方法返回一個視圖。
#有關何時可以返回視圖,請參見torch.Tensor.view()。view之後再說,先看reshape
torch.reshape(input, shape) → Tensor
#返回具有與input相同的數據和元素數量,但具有指定形狀的張量。如果可能,返回的張量將是input視圖。否則,它將是copy的版本。連續輸入和具有兼容步幅的輸入可以在不復制的情況下進行重塑,但是您不應該依賴複製與查看行爲。
#某個尺寸可能爲-1,在這種情況下,它是根據剩餘尺寸和輸入的元素數推斷出來的。(後面會有栗子)
#參數:input (Tensor) – 原始的shape
#shape (tuple of python:ints) – 需要的shape
>>> a = torch.arange(4.)
>>> torch.reshape(a, (2, 2))
tensor([[ 0.,  1.],
        [ 2.,  3.]])
>>> b = torch.tensor([[0, 1], [2, 3]])
#只有一個-1的話,就是直接展開
>>> torch.reshape(b, (-1,))
tensor([ 0,  1,  2,  3])
#給定一個的時候,另外一個就能就算出來
>>> torch.reshape(b, (-1, 2))
tensor([[0, 1],
        [2, 3]])
>>>  b = torch.tensor([[[0, 1], [2, 3]], [[0, 1], [2, 3]], [[0, 1], [2, 3]]])
>>> torch.reshape(b, (-1, 2, -1))
RuntimeError: only one dimension can be inferred
>>> torch.reshape(b, (2, 2, -1))
tensor([[[0, 1, 2],
         [3, 0, 1]],

        [[2, 3, 0],
         [1, 2, 3]]])

torch.Tensor.view()函數

#view(*shape) → Tensor
#返回一個新張量,其數據與self張量相同,但shape是不同。 返回的張量共享相同的數據,並且必須具有相同數量的元素,但可能具有不同的大小。一個張量可以被view,new view的尺寸必須與其原始尺寸和stride兼容,也就是說每個新視圖尺寸必須是原始尺寸的子空間,或者只能跨越原始的d,d+1,...,d+k這些要滿足以下的連續性條件,stride[i]=stride[i+1]×size[i+1] 對於任意的i=0,...,k-1
#一個tensor必須是連續的,才能被contiguous()查看。
>>> x = torch.randn(4, 4)
>>> x.size()
torch.Size([4, 4])
>>> y = x.view(16)
>>> y.size()
torch.Size([16])
>>> z = x.view(-1, 8)  # the size -1 的位置是可以推斷出來
>>> z.size()
torch.Size([2, 8])

>>> a = torch.randn(1, 2, 3, 4)
>>> a.size()
torch.Size([1, 2, 3, 4])
>>> b = a.transpose(1, 2)  # 交換第二維度和第三維度,改變了內存的位置
>>> b.size()
torch.Size([1, 3, 2, 4])
>>> c = a.view(1, 3, 2, 4)  # 不改變內存中的位置
>>> c.size()
torch.Size([1, 3, 2, 4])
>>> torch.equal(b, c) #所以不是一個
False
>>> torch.equal(a, c) #還是不是一個,不清楚官方給這個栗子想說明什麼
False

#順便說一下contiguous()
#返回一個包含與self張量相同數據的連續張量。如果self張量是連續的,則此函數返回self張量。其實就是返回一個結果
#torch.transpose(input, dim0, dim1) → Tensor
#返回張量,該張量是輸入的轉置版本。
#給定的尺寸dim0和dim1被交換。
#生成的張量與輸入張量共享其基礎存儲,因此更改其中一個的內容將更改另一個的內容。
>>> x = torch.randn(2, 3)
>>> x
tensor([[ 1.0028, -0.9893,  0.5809],
        [-0.1669,  0.7299,  0.4942]])
#第一維度和第二維度轉換
>>> torch.transpose(x, 0, 1)
tensor([[ 1.0028, -0.1669],
        [-0.9893,  0.7299],
        [ 0.5809,  0.4942]])
發佈了79 篇原創文章 · 獲贊 26 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章