的訓練過程 模型訓練過程中累計auc

2021-10-14 17:41:57 字數 2098 閱讀 2265

在平時計算auc的時候,大都是使用 sklearn.metrics.roc_auc_score 來計算。一般操作是將每個batch**出來的結果 拼接起來,然後扔到該函式中計算。

但是如果測試集量級過大(比如 10億量級),每個樣本的**結果拼接起來之後至少需要 3g記憶體。這個開銷顯然不是我們想要的。有什麼方法可以不用拼接batch**出來的結果就可以計算auc呢?

回想auc的概率含義:從正例採出乙個樣本,從負例採出乙個樣本,這兩個樣本的模型**值,正例排在負例前面的概率。對應下面這個公式

乙個比較簡單的方法,我們對連續的score進行分桶,然後統計 每個桶裡的 正負例 數量,經過計算就可以得到auc。這個方法的好處是,因為只需要統計 每個桶裡的正負例數量,所以就不用儲存每個樣本的**值。很適合 樣本量級很大的 auc計算。python**如下(翻譯自paddlepaddle計算auc的**~)。

import numpy as np

import sklearn.metrics as sklearn_metrics

class auc(object):

def __init__(self, num_buckets):

self._num_buckets = num_buckets

self._table = np.zeros(shape=[2, self._num_buckets])

def reset(self):

self._table = np.zeros(shape=[2, self._num_buckets])

def update(self, labels: np.ndarray, predicts: np.ndarray):

""":param labels: 1-d ndarray

:param predicts: 1-d ndarray

:return: none

"""labels = labels.astype(np.int)

predicts = self._num_buckets * predicts

buckets = np.round(predicts).astype(np.int)

buckets = np.where(buckets < self._num_buckets,

buckets, self._num_buckets-1)

for i in range(len(labels)):

self._table[labels[i], buckets[i]] += 1

def compute(self):

tn = 0

tp = 0

area = 0

for i in range(self._num_buckets):

new_tn = tn + self._table[0, i]

new_tp = tp + self._table[1, i]

# self._table[1, i] * tn + self._table[1, i]*self._table[0, i] / 2

area += (new_tp - tp) * (tn + new_tn) / 2

tn = new_tn

tp = new_tp

if tp < 1e-3 or tn < 1e-3:

return -0.5 # 樣本全正例,或全負例

return area / (tn * tp)

if __name__ == '__main__':

label = np.random.randint(low=0, high=2, size=[1000])

predict = np.random.uniform(0, 1, size=[1000])

auc = auc(num_buckets=102400)

auc.update(label, predict)

print(auc.compute())

print(sklearn_metrics.roc_auc_score(label, predict))

參考資料

Tensorflow訓練過程中validation

tensorflow因為靜態圖的原因,邊train邊validation的過程相較於pytorch來說複雜一些。分別獲取訓練集和驗證集的資料。我這裡使用的是從tfrecoed讀入資料。training data img name batch train,img batch train,gtboxes...

訓練過程 GPU訓練

為什麼y2b的8m,8張普通tt為啥要跑幾個月?因為gpu其實有60 的時間都是在等待資料填充完成,簡直蠢。1 換個固態硬碟試試?沒用。問題出在系統匯流排上,一幀的資料量入視訊記憶體後有1.58g 當前最優的分布式訓練方式是通過引數伺服器 parameter server 執行的同步隨機梯度下降演算...

Adaboost 訓練過程

每個haar特徵對應看乙個弱分類器,但並不是任伺乙個haar特徵都能較好的描述人臉灰度分布的某一特點,如何從大量的haar特徵中挑選出最優的haar特徵並製作成分類器用於人臉檢測,這是adaboost演算法訓練過程所要解決的關鍵問題。paul viola和michael jones於2001年將ad...