中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

PyTorch中Tensor的維度變換實現

發布時間:2020-10-19 19:09:12 來源:腳本之家 閱讀:151 作者:Steven·簡談 欄目:開發技術

對于 PyTorch 的基本數據對象 Tensor (張量),在處理問題時,需要經常改變數據的維度,以便于后期的計算和進一步處理,本文旨在列舉一些維度變換的方法并舉例,方便大家查看。

維度查看:torch.Tensor.size()

查看當前 tensor 的維度

舉個例子:

>>> import torch
>>> a = torch.Tensor([[[1, 2], [3, 4], [5, 6]]])
>>> a.size()
torch.Size([1, 3, 2])

張量變形:torch.Tensor.view(*args) → Tensor

返回一個有相同數據但大小不同的 tensor。 返回的 tensor 必須有與原 tensor 相同的數據和相同數目的元素,但可以有不同的大小。一個 tensor 必須是連續的 contiguous() 才能被查看。

舉個例子:

>>> x = torch.randn(2, 9)
>>> x.size()
torch.Size([2, 9])
>>> x
tensor([[-1.6833, -0.4100, -1.5534, -0.6229, -1.0310, -0.8038, 0.5166, 0.9774,
     0.3455],
    [-0.2306, 0.4217, 1.2874, -0.3618, 1.7872, -0.9012, 0.8073, -1.1238,
     -0.3405]])
>>> y = x.view(3, 6)
>>> y.size()
torch.Size([3, 6])
>>> y
tensor([[-1.6833, -0.4100, -1.5534, -0.6229, -1.0310, -0.8038],
    [ 0.5166, 0.9774, 0.3455, -0.2306, 0.4217, 1.2874],
    [-0.3618, 1.7872, -0.9012, 0.8073, -1.1238, -0.3405]])
>>> z = x.view(2, 3, 3)
>>> z.size()
torch.Size([2, 3, 3])
>>> z
tensor([[[-1.6833, -0.4100, -1.5534],
     [-0.6229, -1.0310, -0.8038],
     [ 0.5166, 0.9774, 0.3455]],

    [[-0.2306, 0.4217, 1.2874],
     [-0.3618, 1.7872, -0.9012],
     [ 0.8073, -1.1238, -0.3405]]])

可以看到 x 和 y 、z 中數據的數量和每個數據的大小都是相等的,只是尺寸或維度數量發生了改變。

壓縮 / 解壓張量:torch.squeeze()、torch.unsqueeze()

  • torch.squeeze(input, dim=None, out=None)

將輸入張量形狀中的 1 去除并返回。如果輸入是形如(A×1×B×1×C×1×D),那么輸出形狀就為: (A×B×C×D)

當給定 dim 時,那么擠壓操作只在給定維度上。例如,輸入形狀為: (A×1×B),squeeze(input, 0) 將會保持張量不變,只有用 squeeze(input, 1),形狀會變成 (A×B)。

返回張量與輸入張量共享內存,所以改變其中一個的內容會改變另一個。

舉個例子:

>>> x = torch.randn(3, 1, 2)
>>> x
tensor([[[-0.1986, 0.4352]],

    [[ 0.0971, 0.2296]],

    [[ 0.8339, -0.5433]]])
>>> x.squeeze().size() # 不加參數,去掉所有為元素個數為1的維度
torch.Size([3, 2])
>>> x.squeeze()
tensor([[-0.1986, 0.4352],
    [ 0.0971, 0.2296],
    [ 0.8339, -0.5433]])
>>> torch.squeeze(x, 0).size() # 加上參數,去掉第一維的元素,不起作用,因為第一維有2個元素
torch.Size([3, 1, 2])
>>> torch.squeeze(x, 1).size() # 加上參數,去掉第二維的元素,正好為 1,起作用
torch.Size([3, 2])

可以看到如果加參數,只有維度中尺寸為 1 的位置才會消失

  • torch.unsqueeze(input, dim, out=None)

返回一個新的張量,對輸入的制定位置插入維度 1

返回張量與輸入張量共享內存,所以改變其中一個的內容會改變另一個。

如果 dim 為負,則將會被轉化 dim+input.dim()+1

接著用上面的數據舉個例子:

>>> x.unsqueeze(0).size()
torch.Size([1, 3, 1, 2])
>>> x.unsqueeze(0)
tensor([[[[-0.1986, 0.4352]],

     [[ 0.0971, 0.2296]],

     [[ 0.8339, -0.5433]]]])
>>> x.unsqueeze(-1).size()
torch.Size([3, 1, 2, 1])
>>> x.unsqueeze(-1)
tensor([[[[-0.1986],
     [ 0.4352]]],


    [[[ 0.0971],
     [ 0.2296]]],


    [[[ 0.8339],
     [-0.5433]]]])

可以看到在指定的位置,增加了一個維度。

擴大張量:torch.Tensor.expand(*sizes) → Tensor

返回 tensor 的一個新視圖,單個維度擴大為更大的尺寸。 tensor 也可以擴大為更高維,新增加的維度將附在前面。 擴大 tensor 不需要分配新內存,只是僅僅新建一個 tensor 的視圖,其中通過將 stride 設為 0,一維將會擴展位更高維。任何一個一維的在不分配新內存情況下可擴展為任意的數值。

舉個例子:

>>> x = torch.Tensor([[1], [2], [3]])
>>> x.size()
torch.Size([3, 1])
>>> x.expand(3, 4)
tensor([[1., 1., 1., 1.],
    [2., 2., 2., 2.],
    [3., 3., 3., 3.]])
>>> x.expand(3, -1)
tensor([[1.],
    [2.],
    [3.]])

原數據是 3 行 1 列,擴大后變為 3 行 4 列,方法中填 -1 的效果與 1 一樣,只有尺寸為 1 才可以擴大,如果不為 1 就無法改變,而且尺寸不為 1 的維度必須要和原來一樣填寫進去。

重復張量:torch.Tensor.repeat(*sizes)

沿著指定的維度重復 tensor。 不同于 expand(),本函數復制的是 tensor 中的數據。

舉個例子:

>>> x = torch.Tensor([1, 2, 3])
>>> x.size()
torch.Size([3])
>>> x.repeat(4, 2)
    [1., 2., 3., 1., 2., 3.],
    [1., 2., 3., 1., 2., 3.],
    [1., 2., 3., 1., 2., 3.]])
>>> x.repeat(4, 2).size()
torch.Size([4, 6])

原數據為 1 行 3 列,按行方向擴大為原來的 4 倍,列方向擴大為原來的 2 倍,變為了 4 行 6 列。

變化時可以看成是把原數據作成一個整體,再按指定的維度和尺寸重復,變成一個 4 行 2 列的矩陣,其中的每一個單位都是相同的,再把原數據放到每個單位中。

矩陣轉置:torch.t(input, out=None) → Tensor

輸入一個矩陣(2維張量),并轉置0, 1維。 可以被視為函數 transpose(input, 0, 1) 的簡寫函數。

舉個例子:

>>> x = torch.randn(3, 5)
>>> x
tensor([[-1.0752, -0.9706, -0.8770, -0.4224, 0.9776],
    [ 0.2489, -0.2986, -0.7816, -0.0823, 1.1811],
    [-1.1124, 0.2160, -0.8446, 0.1762, -0.5164]])
>>> x.t()
tensor([[-1.0752, 0.2489, -1.1124],
    [-0.9706, -0.2986, 0.2160],
    [-0.8770, -0.7816, -0.8446],
    [-0.4224, -0.0823, 0.1762],
    [ 0.9776, 1.1811, -0.5164]])
>>> torch.t(x) # 另一種用法
tensor([[-1.0752, 0.2489, -1.1124],
    [-0.9706, -0.2986, 0.2160],
    [-0.8770, -0.7816, -0.8446],
    [-0.4224, -0.0823, 0.1762],
    [ 0.9776, 1.1811, -0.5164]])

必須要是 2 維的張量,也就是矩陣,才可以使用。

維度置換:torch.transpose()、torch.Tensor.permute()

  • torch.transpose(input, dim0, dim1, out=None) → Tensor

返回輸入矩陣 input 的轉置。交換維度 dim0 和 dim1。 輸出張量與輸入張量共享內存,所以改變其中一個會導致另外一個也被修改。

舉個例子:

>>> x = torch.randn(2, 4, 3)
>>> x
tensor([[[-1.2502, -0.7363, 0.5534],
     [-0.2050, 3.1847, -1.6729],
     [-0.2591, -0.0860, 0.4660],
     [-1.2189, -1.1206, 0.0637]],

    [[ 1.4791, -0.7569, 2.5017],
     [ 0.0098, -1.0217, 0.8142],
     [-0.2414, -0.1790, 2.3506],
     [-0.6860, -0.2363, 1.0481]]])
>>> torch.transpose(x, 1, 2).size()
torch.Size([2, 3, 4])
>>> torch.transpose(x, 1, 2)
tensor([[[-1.2502, -0.2050, -0.2591, -1.2189],
     [-0.7363, 3.1847, -0.0860, -1.1206],
     [ 0.5534, -1.6729, 0.4660, 0.0637]],

    [[ 1.4791, 0.0098, -0.2414, -0.6860],
     [-0.7569, -1.0217, -0.1790, -0.2363],
     [ 2.5017, 0.8142, 2.3506, 1.0481]]])
>>> torch.transpose(x, 0, 1).size()
torch.Size([4, 2, 3])
>>> torch.transpose(x, 0, 1)
tensor([[[-1.2502, -0.7363, 0.5534],
     [ 1.4791, -0.7569, 2.5017]],

    [[-0.2050, 3.1847, -1.6729],
     [ 0.0098, -1.0217, 0.8142]],

    [[-0.2591, -0.0860, 0.4660],
     [-0.2414, -0.1790, 2.3506]],

    [[-1.2189, -1.1206, 0.0637],
     [-0.6860, -0.2363, 1.0481]]])

可以對多維度的張量進行轉置

  • torch.Tensor.permute(dims)

將 tensor 的維度換位

接著用上面的數據舉個例子:

>>> x.size()
torch.Size([2, 4, 3])
>>> x.permute(2, 0, 1).size()
torch.Size([3, 2, 4])
>>> x.permute(2, 0, 1)
tensor([[[-1.2502, -0.2050, -0.2591, -1.2189],
     [ 1.4791, 0.0098, -0.2414, -0.6860]],

    [[-0.7363, 3.1847, -0.0860, -1.1206],
     [-0.7569, -1.0217, -0.1790, -0.2363]],

    [[ 0.5534, -1.6729, 0.4660, 0.0637],
     [ 2.5017, 0.8142, 2.3506, 1.0481]]])

直接在方法中填入各個維度的索引,張量就會交換指定維度的尺寸,不限于兩兩交換。

 以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

车致| 集贤县| 长丰县| 兖州市| 耿马| 阜城县| 高雄县| 博湖县| 犍为县| 翁牛特旗| 尼木县| 肇源县| 昭平县| 泽州县| 宝山区| 忻城县| 当雄县| 千阳县| 桃园县| 塘沽区| 岢岚县| 长岭县| 新沂市| 阿鲁科尔沁旗| 和政县| 乌兰县| 卓资县| 高平市| 北川| 荥经县| 云阳县| 沙洋县| 古田县| 沙湾县| 寻乌县| 麻阳| 宁乡县| 平谷区| 雅安市| 馆陶县| 德州市|