這是乙個筆記本,記錄在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...