在平時計算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...