經過一段時間的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...