在正常的行人重識別深度學習的模型中,都是先將行人經過backbonne網路,提取特徵,然後再將特徵和linear層進行了鏈結,然後根據輸出的分類概率,來反饋,對網路進行優化。我就在想,可不可以不經過最後的分類層,而是直接在特徵的層面進行優化。所以我寫了乙個損失函式:
import torch
import torch.nn as nn
class features_loss(nn.module):
def __init__(self):
super(features_loss,self).__init__()
def forward(self, features, batch_size, person_num):
loss_all = 0
loss_temp = 0
for id_index in range( batch_size // person_num ):
features_temp_list = features[id_index*person_num:(id_index+1)*person_num+1]
loss_temp = 0
distance = torch.mm(features_temp_list,features_temp_list.t())
distance = 1 -distance
for i in range(person_num):
for j in range( i + 1, person_num ):
loss_temp = loss_temp + distance[i][j]
loss_temp = loss_temp / ( person_num * (person_num-1)/2 )
loss_all = loss_all + loss_temp
loss_all = loss_all / ( batch_size // person_num )
return loss_all
送入這個損失函式的都是經過了標準化的特徵向量,這個函式讓相同label的行人的特徵在余弦距離這個層面上拉近。
在資料的準備階段,我讓每個batch中包含k個id的行人,每個id下面存在n張,就像是triplet loss那樣對資料的mini batch進行取樣。
訓練的時候,我首相將epoch設定為1,產生了epoch1.pth為訓練的結果,然後又設定為60進行訓練,這次的訓練結果為epoch60.pth 。
我們的這個訓練過程的**,以及訓練好的模型,都上傳到了github上,位址為:
首先執行 python3 train.py來訓練模型,然後執行python3 test.py就可以測試了,這個簡單的模型獲得rank1在60%左右。
numpy 計算特徵之間的余弦距離
余弦距離在計算相似度的應用中經常使用,比如 下面是余弦相似度 的計算公式 圖來自wikipedia 但是,余弦相似度和常用的歐式距離的有所區別。歐式距離用於相似度檢索更符合直覺。因此在使用時,需要將余弦相似度轉化成類似歐氏距離的余弦距離。維基頁面中給出的角距離計算公式如下 圖來自wikipedia ...
通過日期計算距離當前時間的距離
格式1 通過 2014 12 11 22 22 22 獲得 今天22 22 昨天22 22 2天前 1個月前 3年前 nsstring datestr 2015 01 15 22 22 22 nsdateformatter dateformat nsdateformatter alloc init ...
特徵向量相似度和距離的計算
本文 1 2特徵向量相似度和距離的計算34 相似度 5 夾角余弦 6 相關係數 7 dice 8 jaccard910 距離11 明氏距離 12 歐氏距離 13 馬氏距離 14 jffreys matusita 距離 15 mahalanobis 距離,未實現,協方差矩陣 16 camberra 距...