# view() 轉(zhuǎn)換維度
# reshape() 轉(zhuǎn)換維度
# permute() 坐標(biāo)系變換
# squeeze()/unsqueeze() 降維/升維
# expand() 擴(kuò)張張量
# narraw() 縮小張量
# resize_() 重設(shè)尺寸
# repeat(), unfold() 重復(fù)張量
# cat(), stack() 拼接張量
1 tensor.view()
view() 用于改變張量的形狀,但不會(huì)改變張量中的元素值。
用法1:
例如,你可以使用view 將一個(gè)形狀是(2,3)的張量變換成(3,2)的張量;
import torch
x = torch.tensor([[1, 2, 3], [4, 5, 6]])
y = x.view(3, 2)
上面的操作相當(dāng)于,先把形狀為**(2,3)的tensor展平,變成(1,6),然后再變成(3,2).**
用法2:
轉(zhuǎn)換前后張量中的元素個(gè)數(shù)不變。view()中若存在某一維的維度是-1,則表示該維的維度根據(jù)總元素個(gè)數(shù)和其他維度尺寸自適應(yīng)調(diào)整。注意,view()中最多只能有一個(gè)維度的維數(shù)設(shè)置成-1。
z = x.view(-1,2)
舉例子:
在卷積神經(jīng)網(wǎng)絡(luò)中,經(jīng)常會(huì)在全連接層用到view進(jìn)行張量的維度拉伸:
假設(shè)輸入特征是BCH*W的4維張量,其中B表示batchsize,C表示特征通道數(shù),H和W表示特征的高和寬,在將特征送入全連接層之前,會(huì)用.view將轉(zhuǎn)換為B*(CHW)的2維張量,即保持batch不變,但將每個(gè)特征轉(zhuǎn)換為一維向量。
2 tensor.reshape()
reshape()與view()使用方法相同。
3 tensor.squeeze()和tensor.unsqueeze()
3.1 tensor.squeeze() 降維
(1)若squeeze()括號(hào)內(nèi)為空,則將張量中所有維度為1的維數(shù)進(jìn)行壓縮,如將1,2,1,9的張量降維到2,9維;若維度中無(wú)1維的維數(shù),則保持源維度不變,如將234維的張量進(jìn)行squeeze,則轉(zhuǎn)換后維度不會(huì)變。
(2)若squeeze(idx),則將張量中對(duì)應(yīng)的第idx維的維度進(jìn)行壓縮,如1,2,1,9的張量做squeeze(2),則會(huì)降維到1,2,9維的張量;若第idx維度的維數(shù)不為1,則squeeze后維度不會(huì)變化。
例如:
3.2 tensor.unsqueeze(idx)升維
在第idx維進(jìn)行升維,將tensor由原本的維度n,升維至n+1維。如張量的維度維2*3,經(jīng)unsqueeze(0)后,變?yōu)?,2,3維度的張量。
4 tensor.permute()
坐標(biāo)系轉(zhuǎn)換,即矩陣轉(zhuǎn)置,使用方法與numpy array的transpose相同。permute()括號(hào)內(nèi)的參數(shù)數(shù)字指的是各維度的索引值。permute是深度學(xué)習(xí)中經(jīng)常需要使用的技巧,一般的會(huì)將BCHW的特征張量,通過(guò)轉(zhuǎn)置轉(zhuǎn)化為BHWC的特征張量,即將特征深度轉(zhuǎn)換到最后一個(gè)維度,通過(guò)調(diào)用**tensor.permute(0, 2, 3, 1)**實(shí)現(xiàn)。
torch.transpose只能操作2D矩陣的轉(zhuǎn)置,而permute()函數(shù)可以對(duì)任意高維矩陣進(jìn)行轉(zhuǎn)置;
簡(jiǎn)單理解:permute()相當(dāng)于可以同時(shí)操作tensor的若干維度,transpose只能同時(shí)作用于tensor的兩個(gè)維度。
permute和view/reshape雖然都能將張量轉(zhuǎn)化為特定的維度,但原理完全不同,注意區(qū)分。view和reshape處理后,張量中元素順序都不會(huì)有變化,而permute轉(zhuǎn)置后元素的排列會(huì)發(fā)生變化,因?yàn)樽鴺?biāo)系變化了。
5 torch.cat([a,b],dim)
在第dim維度進(jìn)行張量拼接,要注意維度保持一致。
假設(shè)a為h1w1的二維張量,b為h2w2的二維張量,torch.cat(a,b,0)表示在第一維進(jìn)行拼接,即在列方向拼接,所以w1和w2必須相等。torch.cat(a,b,1)表示在第二維進(jìn)行拼接,即在行方向拼接,所以h1和h2必須相等。
假設(shè)a為c1h1w1的二維張量,b為c2h2w2的二維張量,torch.cat(a,b,0)表示在第一維進(jìn)行拼接,即在特征的通道維度進(jìn)行拼接,其他維度必須保持一致,即w1=w2,h1=h2。torch.cat(a,b,1)表示在第二維進(jìn)行拼接,即在列方向拼接,必須保證w1=w2,c1=c2;torch.cat(a,b,2)表示在第三維進(jìn)行拼接,即在行方向拼接,必須保證h1=h2,c1=c2;
6 tensor.expand()
擴(kuò)展張量,通過(guò)值復(fù)制的方式,將單個(gè)維度擴(kuò)大為更大的尺寸。使用expand()函數(shù)不會(huì)使原tensor改變,需要將結(jié)果重新賦值。下面是具體的實(shí)例:
以二維張量為例:tensor是1n或n1維的張量,分別調(diào)用tensor.expand(s, n)或tensor.expand(n, s)在行方向和列方向進(jìn)行擴(kuò)展。
expand()的填入?yún)?shù)是size
7 tensor.narrow(dim, start, len)
narrow()函數(shù)起到了篩選一定維度上的數(shù)據(jù)作用.
torch.narrow(input, dim, start, length)->Tensor
input是需要切片的張量,dim是切片維度,start是開(kāi)始的索引,length是切片長(zhǎng)度,實(shí)際應(yīng)用如下:
8 tensor.resize_()
尺寸變化,將tensor截?cái)酁閞esize_后的維度.
9 tensor.repeat()
tensor.repeat(a,b)將tensor整體在行方向復(fù)制a份,在列方向上復(fù)制b份
參考:
pytorch中與tensor維度變化相關(guān)的函數(shù)(持續(xù)更新) - weili21的文章 - 知乎
https://zhuanlan.zhihu.com/p/438099006文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-738282.html
【pytorch tensor張量維度轉(zhuǎn)換(tensor維度轉(zhuǎn)換)】
https://blog.csdn.net/x_yan033/article/details/104965077文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-738282.html
到了這里,關(guān)于關(guān)于pytorch張量維度轉(zhuǎn)換大全的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!