Date: 2020/07/25
Coder: CW
Foreword:
CW有時候逛Github會發(fā)現(xiàn)不少項目代碼中使用到了Meter這個類,meter這個詞的意思是儀表,從名稱上來看莹捡,能feel到它應該是用來度量和記錄某些統(tǒng)計量的,結合項目代碼的上下文也能看明白的確是這樣的意思扣甲。
但是篮赢,之前對Meter的理解也就止步于此齿椅,由于最近它在我逛Github時出現(xiàn)的頻率越來越高,因此就忍不住瞄了下相關源碼启泣,現(xiàn)在我就把這成果記錄在本文涣脚,分享給大家以便快速了解下Meter的打開方式。
Outline
I. Meter概述
II. 舉例:AverageValueMeter
III. 舉例:ConfusionMeter
Meter概述
Meter?這個類是在torchnet.meter模塊中實現(xiàn)的寥茫,它其實是一個抽象類遣蚀,也就是不會干活的家伙,也就裝裝逼纱耻,但能干活的比如ConfusionMeter芭梯、AverageValueMeter(后文會介紹)等都得膜拜它當大佬(作為它的子類),廢話不多說弄喘,先來看看doc string:
如上圖所述玖喘,它是用來“跟蹤”一些統(tǒng)計量的,也就是能夠在一段“歷程”中記錄下某個統(tǒng)計量在迭代過程中不斷變化的值限次,并統(tǒng)計相關的量。
作為大佬(抽象類)柴灯,它提供了以下接口供小弟(子類)們實現(xiàn)卖漫。
舉例:AverageValueMeter
Meter有很多子類,這里就AverageValueMeter來舉個例子說明下其作用赠群。
從名字看來羊始,AverageValueMeter返回的應該是統(tǒng)計量的均值。哦查描,看了其實現(xiàn)的value()這個接口后突委,可以知道它還返回了標準差。由于它暴露給外界獲取值的只有value()這個接口冬三,因此通過這個Meter并不能知道統(tǒng)計量每次迭代的最新值匀油,僅僅能夠知道均值和標準差。
另外說明下勾笆,self.n其實并不一定等于迭代次數(shù)敌蚜。因為可以對每次加入的數(shù)值設置單位量(相當于權重),通常來說窝爪,每次迭代得到一個新的數(shù)值弛车,單位量為1,代表多了一個數(shù)蒲每,這樣的話self.n就等同于迭代次數(shù)纷跛。
重頭戲來了,看看每次迭代更新的過程中邀杏,它做了什么贫奠。
看下圖,如上所述,若加入數(shù)值時單位量不為1叮阅,那么到頭來self.n就不是迭代次數(shù)了刁品,而是在整個迭代過程中單位量的總和。
這里對于均值和標準差需要稍微動下腦筋進行推導浩姥,此處就均值的計算進行下說明挑随。
self.mean = self.sum / self.n 這點毋庸置疑,OK開始往下推導勒叠。
self.sum = sum_old + value兜挨,而sum_old=self.mean_old * (self.n - n),于是:
self.sum = self.mean_old * (self.n - n) + value眯分,去括號重新組合下:
self.sum = self.mean_old * self.n + (value - n * self.mean_old)
從而得到 self.mean = self.mean_old + (value - n* self.mean_old) / self.n
舉例:ConfusionMeter
一個例子不過癮拌汇?再來個嘗嘗香不香!
顧名思義弊决,ConfusionMeter是混淆矩陣形式的Meter噪舀。
self.conf就是混淆矩陣,conf是confusion的意思飘诗,初始化為0与倡。
這個Meter暴露給外界的也就是這個混淆矩陣。
這里需要注意下昆稿,如果是K分類(通過初始化是設置self.k)問題纺座,那么這里傳入的預測和目標的各個值需要在[0, K-1]范圍內(nèi)。
target可以是二維的溉潭,對應的是one-hot形式净响。
精華都在以下這張圖里,舉個例子來說明喳瓣。
假如是二分類問題馋贤,此時self.k=2,同時predicted和target的取值范圍都在[0, 1]內(nèi)畏陕,那么x的取值就可能是0掸掸、1、2蹭秋、3這4種情況扰付。直觀上來看,處于邊界的兩種情況(0和3)代表預測效果較好仁讨,因為0的時候predicted和target都為0羽莺,而3的時候兩者都為1,也就是預測都正確了洞豁。
np.bincount會根據(jù)x的各個值劃分bin(區(qū)間)盐固,然后統(tǒng)計x中每個值出現(xiàn)的次數(shù)荒给,對應到每個bin上(想象下條形圖那種結構)。最后再將bincount的結果reshape到kxk矩陣的形式刁卜。