tensor 乘
tensor 加
# view() 轉(zhuǎn)換維度
# reshape() 轉(zhuǎn)換維度
# permute() 坐標系變換
# squeeze()/unsqueeze() 降維/升維
# expand() 擴張張量
# narraw() 縮小張量
# resize_() 重設(shè)尺寸
# repeat(), unfold() 重復(fù)張量
# cat(), stack() 拼接張量
1 tensor.view()
view() 用于改變張量的形狀,但不會改變張量中的元素值。
用法1:
例如,你可以使用view 將一個形狀是(2,3)的張量變換成(3,2)的張量;
import torch
x = torch.tensor([[1, 2, 3], [4, 5, 6]])
y = x.view(3, 2)
上面的操作相當于,先把形狀為**(2,3)的tensor展平,變成(1,6),然后再變成(3,2).**
用法2:
轉(zhuǎn)換前后張量中的元素個數(shù)不變。view()中若存在某一維的維度是-1,則表示該維的維度根據(jù)總元素個數(shù)和其他維度尺寸自適應(yīng)調(diào)整。注意,view()中最多只能有一個維度的維數(shù)設(shè)置成-1。
z = x.view(-1,2)
舉例子:
在卷積神經(jīng)網(wǎng)絡(luò)中,經(jīng)常會在全連接層用到view進行張量的維度拉伸:
假設(shè)輸入特征是BCH*W的4維張量,其中B表示batchsize,C表示特征通道數(shù),H和W表示特征的高和寬,在將特征送入全連接層之前,會用.view將轉(zhuǎn)換為B*(CHW)的2維張量,即保持batch不變,但將每個特征轉(zhuǎn)換為一維向量。
2 tensor.reshape()
reshape()與view()使用方法相同。
3 tensor.squeeze()和tensor.unsqueeze()
3.1 tensor.squeeze() 降維
(1)若squeeze()括號內(nèi)為空,則將張量中所有維度為1的維數(shù)進行壓縮,如將1,2,1,9的張量降維到2,9維;若維度中無1維的維數(shù),則保持源維度不變,如將234維的張量進行squeeze,則轉(zhuǎn)換后維度不會變。
(2)若squeeze(idx),則將張量中對應(yīng)的第idx維的維度進行壓縮,如1,2,1,9的張量做squeeze(2),則會降維到1,2,9維的張量;若第idx維度的維數(shù)不為1,則squeeze后維度不會變化。
例如:
3.2 tensor.unsqueeze(idx)升維
在第idx維進行升維,將tensor由原本的維度n,升維至n+1維。如張量的維度維2*3,經(jīng)unsqueeze(0)后,變?yōu)?,2,3維度的張量。
4 tensor.permute()
坐標系轉(zhuǎn)換,即矩陣轉(zhuǎn)置,使用方法與numpy array的transpose相同。permute()括號內(nèi)的參數(shù)數(shù)字指的是各維度的索引值。permute是深度學(xué)習(xí)中經(jīng)常需要使用的技巧,一般的會將BCHW的特征張量,通過轉(zhuǎn)置轉(zhuǎn)化為BHWC的特征張量,即將特征深度轉(zhuǎn)換到最后一個維度,通過調(diào)用**tensor.permute(0, 2, 3, 1)**實現(xiàn)。
torch.transpose只能操作2D矩陣的轉(zhuǎn)置,而permute()函數(shù)可以對任意高維矩陣進行轉(zhuǎn)置;
簡單理解:permute()相當于可以同時操作tensor的若干維度,transpose只能同時作用于tensor的兩個維度。
permute和view/reshape雖然都能將張量轉(zhuǎn)化為特定的維度,但原理完全不同,注意區(qū)分。view和reshape處理后,張量中元素順序都不會有變化,而permute轉(zhuǎn)置后元素的排列會發(fā)生變化,因為坐標系變化了。
5 torch.cat([a,b],dim)
在第dim維度進行張量拼接,要注意維度保持一致。
假設(shè)a為h1w1的二維張量,b為h2w2的二維張量,torch.cat(a,b,0)表示在第一維進行拼接,即在列方向拼接,所以w1和w2必須相等。torch.cat(a,b,1)表示在第二維進行拼接,即在行方向拼接,所以h1和h2必須相等。
假設(shè)a為c1h1w1的二維張量,b為c2h2w2的二維張量,torch.cat(a,b,0)表示在第一維進行拼接,即在特征的通道維度進行拼接,其他維度必須保持一致,即w1=w2,h1=h2。torch.cat(a,b,1)表示在第二維進行拼接,即在列方向拼接,必須保證w1=w2,c1=c2;torch.cat(a,b,2)表示在第三維進行拼接,即在行方向拼接,必須保證h1=h2,c1=c2;
6 torch.stack()
該函數(shù)在維度上連接若干個形狀相同的張量,最終結(jié)果會升維;即若干個張量在某一維度上連接生成一個擴維的張量。 堆疊的感覺。
7 torch.chunk()和torch.split()
torch.chunk(input, chunks, dim)
**torch.chunk()**的作用是把一個tensor均勻分成若干個小tensor。input是被分割的tensor。chunks是均勻分割的份數(shù),如果在進行分割的維度上的size不能被chunks整除,則最后一份tensor會略?。ㄒ部赡転榭眨im是確定在某個維度上進行分割。該函數(shù)返回的是由小tensor組成的tuple。
**torch.split()**可以說是torch.chunk()的升級版,它不僅可以按份數(shù)均勻分割,還可以按特定的方案進行分割。
torch.split(input, split_size_or_sections, dim=0)
與torch.chunk()的區(qū)別就在于第二個參數(shù)上面。如果第二個參數(shù)是分割份數(shù),這就和torch.chunk()一樣了;第二種是分割方案,是一個list類型的數(shù)據(jù),待分割的張量將會被分割為len(list)份,每一份的大小取決于list中的元素。
8 與tensor相乘運算
- 元素積(element-wise),即相同形狀的矩陣對應(yīng)元素相乘,得到的元素為結(jié)果矩陣中各個元素的值,對應(yīng)函數(shù)為torch.mul()(和*的效果一樣)。
- 矩陣乘法,對應(yīng)函數(shù)為torch.mm()(只能用于2d的tensor)或者torch.matmul()(和符號@效果一樣)。對于torch.matmul(),定義其矩陣乘法僅在最后的兩個維度上,前面的維度需要保持一致。如果前面的維度符合broadcast_tensor機制,也會自動擴展維度,保證兩個矩陣前面的維度一致。
9 與tensor相加運算
遵循下面兩點:
- 當兩個tensor的維度相同時,對應(yīng)軸的值要一樣(每個維度的大小相等),或者某些維度大小為1。相加時把所有為1的軸進行復(fù)制擴充得到兩個維度完全相同的張量,然后對應(yīng)位置相加即可。
- 當兩個相加的tensor維度不一致時,首先要把維度低的那個張量從右邊和維度高的張量對齊,用1擴充維度至和高維度張量的維度一致,然后進行<1>的操作。
10 tensor.expand()
擴展張量,通過值復(fù)制的方式,將單個維度擴大為更大的尺寸。使用expand()函數(shù)不會使原tensor改變,需要將結(jié)果重新賦值。下面是具體的實例:
以二維張量為例:tensor是1n或n1維的張量,分別調(diào)用tensor.expand(s, n)或tensor.expand(n, s)在行方向和列方向進行擴展。
expand()的填入?yún)?shù)是size
11 tensor.narrow(dim, start, len)
narrow()函數(shù)起到了篩選一定維度上的數(shù)據(jù)作用.
torch.narrow(input, dim, start, length)->Tensor
input是需要切片的張量,dim是切片維度,start是開始的索引,length是切片長度,實際應(yīng)用如下:
12 tensor.resize_()
尺寸變化,將tensor截斷為resize_后的維度.
13 tensor.repeat()
tensor.repeat(a,b)將tensor整體在行方向復(fù)制a份,在列方向上復(fù)制b份
14 unbind()
torch.unbind()移除指定維后,返回一個元組,包含了沿著指定維切片的各個切片。
torch.unbind(input, dim=0)->seq
參考:
pytorch中與tensor維度變化相關(guān)的函數(shù)(持續(xù)更新) - weili21的文章 - 知乎
https://zhuanlan.zhihu.com/p/438099006文章來源:http://www.zghlxwxcb.cn/news/detail-738640.html
【pytorch tensor張量維度轉(zhuǎn)換(tensor維度轉(zhuǎn)換)】
https://blog.csdn.net/x_yan033/article/details/104965077文章來源地址http://www.zghlxwxcb.cn/news/detail-738640.html
到了這里,關(guān)于關(guān)于pytorch張量維度轉(zhuǎn)換及張量運算的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!