triplet計算細節
訓練過程中的呼叫
import torch
from torch.autograd import function
from torch.nn.modules.distance import pairwisedistance
class
tripletloss
(function)
:def
__init__
(self, margin)
:super
(tripletloss, self)
.__init__(
) self.margin = margin
self.pdist = pairwisedistance(2)
defforward
(self, anchor, positive, negative)
:# [在triplet_loss.py 的 13行位置處,填寫**,完成triplet loss的計算]
pos_dist=self.pdist.forward(anchor,positive)
neg_dist=self.pdist.forward(anchor,negative)
hinge_dist = torch.clamp(self.margin + pos_dist - neg_dist,
min=
0.0)
loss = torch.mean(hinge_dist)
return loss
tri
plet
loss
=max
(0,m
argi
n+ds
+dns
)tripletloss = max(0, margin + d_s +d_)
triple
tlos
s=ma
x(0,
marg
in+d
s+d
ns)
其中d
sd_s
ds 為anchor和正樣本的距離,dns
d_dn
s為anchor和負樣本的距離,margin為自己設定的乙個控制loss嚴苛程度的值。將anchor、正樣本、負樣本分別通過網路得到feature,計算a與p、 a與n之間的差的l2norm,得到d
sd_s
ds 、dns
d_dn
s,代入計算。
因為本次是小資料集訓練,所以沒有將原始資料集解壓,而是用的小樣本的資料集。所以要修改訓練資料的生成路徑:
# 訓練資料生成器
train_dataloader = torch.utils.data.dataloader(
dataset=traindataset(
face_dir=
"../../datasets/vggface2_train_face"
, csv_name=
'../../datasets/vggface2_train_face.csv'
, num_triplets=
1000
, training_triplets_path=
'../../datasets/training_triplets_1000_20201101.npy'
, transform=train_data_transforms,
predicter_path=
'shape_predictor_68_face_landmarks.dat'
, img_size=
256)
, batch_size=30,
num_workers=0,
shuffle=
false
)
順便還發現沒有上傳landmark模型,補上了。
再次訓練:
發現已經成功載入進1000個三元組了,然後報錯是在訓練完儲存模型的時候,沒有對應目錄。新建乙個對應的目錄。可以makedir也可以直接手動新建。
增加了epoch的顯示,讓訓練過程心裡有個數,原始資料是1900個epoch,等不了那麼久,先跑通更重要,於是改了50。
# 打卡時間、epoch
total_time_start = time.time(
)start_epoch = start_epoch
end_epoch = start_epoch +
50#原來是1900 太多了
# 匯入l2計算的
l2_distance = pairwisedistance(2)
# 為了打日誌先預製個最低auc和最佳acc在前頭
大概十幾個epoch就收斂到0了,感覺是過擬合了,估計是樣本太少了。相比這些小數量的樣本,訓練的epoch太多使其產生過擬合的情況。
week5 作業A 最大矩形
給乙個直方圖,求直方圖中的最大矩形的面積。例如,下面這個中直方圖的高度從左到右分別是2,1,4,5,1,3,3,他們的寬都是1,其中最大的矩形是陰影部分。input 輸入包含多組資料。每組資料用乙個整數n來表示直方圖中小矩形的個數,你可以假定1 n 100000.然後接下來n個整數h1,hn,滿足 ...
week5 作業D 滑動視窗
zjm 有乙個長度為 n 的數列和乙個大小為 k 的視窗,視窗可以在數列上來回移動.現在 zjm 想知道在視窗從左往右滑的時候,每次視窗內數的最大值和最小值分別是多少.例如 數列是 1 3 1 3 5 3 6 7 其中 k 等於 3.輸入有兩行。第一行兩個整數n和k分別表示數列的長度和滑動視窗的大小...
week5作業題 A 最大矩形
給乙個直方圖,求直方圖中的最大矩形的面積。例如,下面這個中直方圖的高度從左到右分別是2,1,4,5,1,3,3,他們的寬都是1,其中最大的矩形是陰影部分。input 輸入包含多組資料。每組資料用乙個整數n來表示直方圖中小矩形的個數,你可以假定1 n 100000.然後接下來n個整數h1,hn,滿足 ...