Pytorch函式集合

2021-10-09 17:34:27 字數 4055 閱讀 5649

這是乙個筆記本,記錄在pytorch種遇到的一些小函式的使用說明,不斷更新中。

gt、ge、eq、lt、le系列函式:

torch.gt(input,value)

returns: bool tensor,shape as input

即greaterthan、greateerqual、equal、lessthan、lessequal

用於比較tensor與指定值的大小,輸出同shape的bool型變數

torch.long、torch.uint8型別用作索引的區別:

t = torch.randn(4,2)

mask = torch.ones(4,dtype=torch.uint8)

mask[2] = 0

print(t[mask,:])

uint8可以理解為bool型索引,此時需要與tensor的維度保持一致,當對應位置的元素為1或true時則從t中輸出該元素

t = torch.randn(4,2)

mask = torch.ones(4,dtype=torch.long)

mask[2] = 0

print(t[mask,:])

long可以理解為要取出的元素的索引,無需與tensor維度一致,上述**從t中依次取出[1,1,0,1]位置的元素

tensor.repeat,torch.meshgrid:

t = torch.rand(1,3)

t_r = t.repeat(5,1)

print(t_r.shape)

輸出為torch.size([5,3]),將tensor在對應位置上重複n次。

例如:想要得到5x3大小的特徵圖上每個點的xy座標,則x為

對於每列上的x座標都是相同的,所以生成一列x座標,然後重複3次

那麼首先生成一列x座標:cx = torch.arange(5).view(5,1)

然後在列方向重複3次變成3列:cx = cx.repeat(1,3)

最終得到了(5,3)的cx座標

y座標類似,就是torch.arange(3).view(1,3).repeat(5,1),得到(5,3)的cy座標

最後用torch.stack([a,b],axis=2)即可得到(5,3,2)的cxy座標

注意:把矩陣看作影象時索引的xy是反的。

另一種方式就是torch.meshgrid函式:

torch.meshgrid函式是按照矩陣的方式生成網格座標的,例如特徵圖為5x3大小,即寬w=3,高h=5

x,y = torch.meshgrid(torch.arange(h),torch.arange(w))

就生成(5x3)的網格矩陣了。

np.meshgrid則是按照影象的xy方式生成網格的。torch更符合直覺

nn.bceloss,nn.bcewithlogitsloss,nn.crossentropyloss

nn.crossentropyloss的輸入為:preds->(batch,n_class,feat_size),labels(batch,feat_size)

函式會先對preds作softmax,然後再進行交叉熵損失函式的計算

nn.bceloss和withlogitsloss輸入的preds和labels維度相同,都是->(batch,c,feat_size),

函式會在c維度上進行進項逐項的交叉熵損失計算

withlogitsloss會先進行sigmoid再計算交叉熵。

nn.bcewithlogitsloss(pos_weight=torch.tensor())

pos_weight引數用來調整不同類損失所佔權重。

例如:3類的分類任務,則網路輸出為(n,3),設定reduciton='none',則損失輸出為(n,3)

bcecls_w = nn.bcewithlogitsloss(pos_weight = torch.tensor([0.1,0.2,0.3]),reduction='none')

bcecls = nn.bcewithlogitsloss(pos_weight = torch.tensor([1]),reduction='none')

label = torch.tensor([[1,0,0],[0,0,1]])

pred = torch.tensor([[1,0.1,0],[0,1,3]])

bcecls(pred,label)

#tensor([[0.3133, 0.7444, 0.6931],

[0.6931, 1.3133, 0.0486]])

bcecls_w(pred,label)

#tensor([[0.0313, 0.7444, 0.6931],

[0.6931, 1.3133, 0.0146]])

並不是對3個數字都乘weight,樣本1**結果為0類,只對0類的**乘weight,其他保持不變。

類似的,樣本2**結果為2類,則只對0.0486乘權重0.3。

pytorch nms函式

def box_iou(box1, box2):

# """

return intersection-over-union (jaccard index) of boxes.

both sets of boxes are expected to be in (x1, y1, x2, y2) format.

arguments:

box1 (tensor[n, 4])

box2 (tensor[m, 4])

returns:

iou (tensor[n, m]): the nxm matrix containing the pairwise

iou values for every element in boxes1 and boxes2

"""def box_area(box):

# box = 4xn

return (box[2] - box[0]) * (box[3] - box[1])

area1 = box_area(box1.t)

area2 = box_area(box2.t)

# inter(n,m) = (rb(n,m,2) - lt(n,m,2)).clamp(0).prod(2)

inter = (torch.min(box1[:, none, 2:], box2[:, 2:]) - torch.max(box1[:, none, :2], box2[:, :2])).clamp(0).prod(2)

return inter / (area1[:, none] + area2 - inter) # iou = inter / (area1 + area2 - inter)

params:

待nms的檢測框sets,對應的得分scores

# 1表示被抑制,0表示不抑制

suppress = torch.zeros(sets.size(0),dtype=torch.bool)

_,idx = scores.sort(descending=true)

sets_sorted = sets[idx]

ious = box_iou(sets_sorted,sets_sorted)

for k in range(ious.size(0)):

if suppress[k] == 1:

continue

suppress = torch.max(suppress, (ious[k]>threshod))

#上面一步會把當前框也抑制掉,所以強制改為0

suppress[k] = 0

#1-suppress就是nms後剩餘框的位置,即[true,false...]

idx[~suppress] #即可取出保留框的索引

pytorch常用函式

torch.cat torch.squeeze torch.unsqueeze torch.stack torch.sum torch.sum input dim,out none tensor input tensor 輸入張量 dim int 縮減的維度 out tensor,optional ...

pytorch基礎函式

返回乙個張量,從標準正態分佈 均值為0,方差為1 中抽取的一組隨機數。張量的形狀由引數sizes定義。import torch import torch.nn.functional as f x1 torch.tensor 1,2,3,4 1,3,4,5 3,4,5,6 y11 f.softmax ...

pytorch 常用函式

pytorch 常用函式 參考 網易雲課堂pytorch 學習 建立tensor import from numpy import numpy as np import torch a np.array 2,3.3 torch.from numpy a out tensor 2.0000,3.300...