Pytorch對Tensor的各種「特別」操作

2021-09-02 11:18:07 字數 2219 閱讀 7983

經過一段時間的pytorch使用,發現提供的tensor型別中大部分操作都很好理解,比如各種數學操作(abs,add,asin,mul,div)和它們組成的復合操作(addcdiv,addcmul)等。

下面將對於寫**時,我遇到的一些常用的「特殊」操作,總結mark下:

用來「截斷」tensor,使每個元素都保持在min~max範圍內

torch.clamp(

input

,min

,max

,out=

none

)

沿著第dim維度將seq中的tensor合併成乙個tensor

torch.cat(seq,dim=

0,out=

none

)

按照第dim維,將tensor分成chunks塊(如果不能整除的話,則最後一塊會略小,比如該維度為3則分成2和1)

torch.chunk(tensor,chunks,dim=

0)

將input的tensor,按照第dim的引索index重新聚合,這個不太好直接理解,所以上圖說明,c按照第1維為標準(按照行看),所以所以聚合後的index,代替原來第1維上index第一行的引索由(0,1)變為(0,0)所以得到了新行[0,0],依此類推下面兩行。

d按照第0維為標準(按照列看),第一列引索變為(0,1,1),所以得到了新列[0,2,2]

對於tensor來說,可能存在某個維度上的大小為1,比如tensor a的shape為[2,1,1,2,2],那麼對它使用squeeze後,將壓縮所有大小為0的維度使他的shape變為[2,2,2]。如果指定了dim則指處理該維度,比如dim=0,則保持不變,因為該維度大小不為1,反之指定dim=2時,由於該維度大小為1,則壓縮為[2,1,2,2]

torch.squeeze(

input

,dim=

none

,out=

none

)

和squeeze相反,用來新增維度,必須指定dim,新增到第dim維上

torch.unsqueeze(

input

,dim=

none

,out=

none

)

這個常用與調整影象tensor,如輸入影象資料為(n,224,224,3),

實際pytorch中網路需要接受(n,3,224,224)的影象,就可以使用permute 調整維度順序。其中dim*接受改變後各維度順序的引數,比如[0,3,1,2]即可將最後乙個維度提到前面。

torch.tensor.permute(dim*

)

使用nn.constantpad2d,前面tuple裡的四個引數左右上下的填充大小,最後指定填充的值。

self.pad = nn.constantpad2d((0

,1,0

,1),

0)

利用pytorch提供的torch.nn.cosinesimilarity函式,但是該函式只接受shape相同的tensor,所以對於shape不同的tensor,需要通過unsqueeze和expand處理成相同的shape。

cos = torch.nn.cosinesimilarity(dim=

2, eps=1e-

6)defcos_dist

(x, y)

:# x: n x d

# y: m x d

n = x.size(0)

m = y.size(0)

d = x.size(1)

assert d == y.size(1)

x = x.unsqueeze(1)

.expand(n, m, d)

y = y.unsqueeze(0)

.expand(n, m, d)

return

-cos(x,y)

未完待續~

Pytorch對多維Tensor按維度操作

記憶要點 dim 0 說明是處理行 dim 1 說明是處理列 keepdim true 保留處理的行 列的特徵 keepdim false 不保留處理的行 列的特徵 網上流傳的版本有很多,但是我們根據結果來說話。我的理解是哪個維度發生了變化就是處理的是哪個維度。if name main 模型引數初始...

pytorch的tensor與numpy陣列共享值

網上的很多部落格說tensor與numpy陣列共享記憶體,這是錯誤的 先給結論 tensor與numpy陣列共享部分記憶體,說共享值更嚴謹,且有條件 看 a torch.ones 2,2 b a.numpy print id a print id b 輸出 3030786996336 3030755...

pytorch中tensor的型別轉換

1 資料型別轉換 在tensor後加 long int float double 等即可,也可以用.to 函式進行轉換,所有的tensor型別可參考 2 資料儲存位置轉換 cpu張量 gpu張量,使用data.cuda gpu張量 cpu張量,使用data.cpu 3 與numpy資料型別轉換 te...