Ⅰ learning confidence for out-of-distribution detection in neural networks
神經網路擁有很強的預測能力,但它們往往無法知道自己的預測何時可能出錯。與此密切相關的是out-of-distribution檢測任務,在這個任務中,模型必須確定輸入是否超出了它的能力范圍。為了解決這些問題,文章提出了一種學習神經網路置信度估計的方法,該方法易於實現,並產生直觀的可解釋輸出,且不需要使用out-of-distribution的樣本來進行訓練。
這篇文章直接在訓練分類模型的同時訓練一個信心估計(confidence estimate)的模型。給定每一個輸入的樣本,神經網路除了給出分類結果之外,同時還給出一個confidence,表示神經網路對這個結果的信心。文章期望遇到in distribution樣本的時候,模型給出一個較高的confidence,而遇到out-of-distribution樣本的時候,模型能給出一個比較低的confidence。
對於out-of-distribution檢測任務來說,這雖然是一個二分類問題,但是它與常見的二分類問題不同,主要區別在與沒有訓練集。因為在實際應用場景中,in distribution和out-of-distribution的比例極為懸殊,直接使用標簽去進行學習顯然是不可取的。
為了解決這個問題,作者開了這么一個腦洞:
假設我們需要回答一系列問題,而我們可以根據對問題的熟悉程度來選擇獲取一些額外的提示,每回答對一個問題就會得到一些分數,當然每獲取一次提示就會扣一些分數。我們的目標是要得到盡量多的分數。
顯然,對於上面這個腦洞來說,想獲得高分的策略就是在熟悉的問題上盡量不需要提示,而在不熟悉的問題上去獲取一些提示。而這篇文章的思路就是基於這個策略。
文章設計的模型架構如上圖所示。在原來的神經網路上加了一個輸出 作為原來的輸出 (預測結果)的信心得分。整個網路可以形式化地描述為:
在訓練過程中,模型的預測結果在經過「提示」之後,可以寫成:
其中, 這一項實際上就是代表「提示」。
那麼分類的損失函數就應該寫為:
顯然,如果直接用這個損失函數進行訓練,神經網路會傾向於將信心得分 訓練為0,這樣得到的預測結果 實際就是ground truth。
但是不要忘了在motivation中提到的,每給一點提示就會扣一些分數。文章就增加了一個損失函數來做為 的懲罰:
整個神經網路的損失函數就變成了:
其中, 是一個超參數。
作者在實現的過程中首先遇到的問題是神經網路傾向於把任意輸入的信息得分 統一成一個值,也就是說,無論是什麼輸入,神經網路都認為信心得分是一樣的,這顯然違背了設計的初衷。
為了解決這個問題,文章引入了一個budget參數 :當 的時候(即信心得分 比較小),增加 ,而當 的時候(即信心得分 比較大),就減少 。這個操作很好理解,如果神經網路的信心不足( 較大),則增大信心的loss所佔比例,以增強信心;
如果信心比較強( 較小),則減小信心的loss所佔比例,優先提高准確率。
作者在實驗過程中發現這種學習信心的機制導致了強烈的正則化,讓神經網路能夠忽略一些數據集的噪音。但是這也帶來了一些負面影響:神經網路在處理邊界數據的時候會比較「懶」,影響了訓練得到模型的性能。
為了解決這個矛盾,作者在訓練的時候,有一半的數據採用新提出的損失函數,即 ,而另一半則採用原來的損失函數。
這部分沒看懂
之前有一些技術直接使用分類器在所有類別中的最高得分,即 作為信心得分,這篇文章採用另外一種方式,直接訓練一個模型來估算信心得分。文章只是通過實驗驗證了兩種方法的優劣,但遺憾的是並未深入分析導致這種結果的原因
Ⅱ YOLOv1網路
YOLO意思是You Only Look Once,創造性的將候選區和對象識別這兩個階段合二為一,看一眼圖片(不用看兩眼哦)就能知道有哪些對象以及它們的位置。其最大的特點是運行速度很快,可以用於實時系統。
實際上,YOLO並沒有真正去掉候選區,而是採用了預定義的候選區(准確點說應該是預測區,因為並不是Faster RCNN所採用的Anchor)。也就是將圖片劃分為 7 * 7=49 個網格(grid),每個網格允許預測出2個邊框(bounding box,包含某個對象的矩形框),總共 49 * 2=98 個bounding box。可以理解為98個候選區,它們很粗略的覆蓋了圖片的整個區域。
RCNN雖然會找到一些候選區,但畢竟只是候選,等真正識別出其中的對象以後,還要對候選區進行微調,使之更接近真實的bounding box。這個過程就是邊框回歸:將候選區bounding box調整到更接近真實的bounding box。
既然反正最後都是要調整的,幹嘛還要先費勁去尋找候選區呢,大致有個區域范圍就行了,所以YOLO就這么幹了。
去掉候選區這個步驟以後,YOLO的結構非常簡單,就是單純的卷積、池化最後加了兩層全連接。單看網路結構的話,和普通的CNN對象分類網路幾乎沒有本質的區別, 最大的差異是最後輸出層用線性函數做激活函數,因為需要預測bounding box的位置(數值型),而不僅僅是對象的概率。 所以粗略來說,YOLO的整個結構就是輸入圖片經過神經網路的變換得到一個輸出的張量,如下圖所示。
因為只是一些常規的神經網路結構,所以,理解YOLO的設計的時候,重要的是理解輸入和輸出的映射關系。
輸入就是原始圖像,唯一的要求是縮放到448 * 448的大小。主要是因為YOLO的網路中,卷積層最後接了兩個全連接層,全連接層是要求固定大小的向量作為輸入,所以倒推回去也就要求原始圖像有固定的尺寸。那麼YOLO設計的尺寸就是448*448。
輸出是一個 7 7 30 的張量(tensor)。
1) 7 * 7網格
根據YOLO的設計,輸入圖像被劃分為 7 * 7 的網格(grid),輸出張量中的 7 * 7 就對應著輸入圖像的 7 * 7 網格。或者我們把 7 * 7 * 30 的張量看作 7 * 7=49個30維的向量,也就是輸入圖像中的每個網格對應輸出一個30維的向量。參考上圖,比如輸入圖像左上角的網格對應到輸出張量中左上角的向量。
要注意的是,並不是說僅僅網格內的信息被映射到一個30維向量。經過神經網路對輸入圖像信息的提取和變換,網格周邊的信息也會被識別和整理,最後編碼到那個30維向量中。
2)30維向量
具體來看每個網格對應的30維向量中包含了哪些信息。
因為YOLO支持識別20種不同的對象(人、鳥、貓、汽車、椅子等),所以這里有20個值表示該網格位置存在任一種對象的概率。可以記為 ,之所以寫成條件概率,意思是如果該網格存在一個對象Object,那麼它是 的概率是 。記不清條件概率的同學可以參考一下 理解貝葉斯定理 )
每個bounding box需要4個數值來表示其位置,(Center_x,Center_y,width,height),即(bounding box的中心點的x坐標,y坐標,bounding box的寬度,高度),2個bounding box共需要8個數值來表示其位置。
bounding box的置信度 = 該bounding box內存在對象的概率 * 該bounding box與該對象實際bounding box的IOU,用公式來表示就是
是bounding box內存在對象的概率,區別於上面的 , 並不管是哪個對象,它體現的是 有或沒有 對象的概率;上面的 意思是假設已經有一個對象在網格中了,這個對象具體是哪一個。
是 bounding box 與 對象真實bounding box 的IOU(Intersection over Union,交並比)。要注意的是,現在討論的30維向量中的bounding box是YOLO網路的輸出,也就是預測的bounding box。所以 體現了預測的bounding box與真實bounding box的接近程度。
還要說明的是,雖然有時說"預測"的bounding box,但這個IOU是在訓練階段計算的。等到了測試階段(Inference),這時並不知道真實對象在哪裡,只能完全依賴於網路的輸出,這時已經不需要(也無法)計算IOU了。
綜合來說,一個bounding box的置信度Confidence意味著它 是否包含對象且位置准確的程度。置信度高表示這里存在一個對象且位置比較准確,置信度低表示可能沒有對象 或者 即便有對象也存在較大的位置偏差。
簡單解釋一下IOU。下圖來自Andrew Ng的深度學習課程,IOU=交集部分面積/並集部分面積,2個box完全重合時IOU=1,不相交時IOU=0。
總的來說,30維向量 = 20個對象的概率 + 2個bounding box * 4個坐標 + 2個bounding box的置信度。
3)討論
每個30維向量中只有一組(20個)對象分類的概率,也就只能預測出一個對象。所以輸出的 7 * 7=49個 30維向量,最多表示出49個對象。
每個30維向量中有2組bounding box,所以總共是98個候選區。
Faster RCNN等一些演算法採用每個grid中手工設置n個Anchor(先驗框,預先設置好位置的bounding box)的設計,每個Anchor有不同的大小和寬高比。YOLO的bounding box看起來很像一個grid中2個Anchor,但它們不是。YOLO並沒有預先設置2個bounding box的大小和形狀,也沒有對每個bounding box分別輸出一個對象的預測。它的意思僅僅是對一個對象預測出2個bounding box,選擇預測得相對比較準的那個。
這里採用2個bounding box,有點不完全算監督演算法,而是像進化演算法。如果是監督演算法,我們需要事先根據樣本就能給出一個正確的bounding box作為回歸的目標。但YOLO的2個bounding box事先並不知道會在什麼位置,只有經過前向計算,網路會輸出2個bounding box,這兩個bounding box與樣本中對象實際的bounding box計算IOU。這時才能確定,IOU值大的那個bounding box,作為負責預測該對象的bounding box。
訓練開始階段,網路預測的bounding box可能都是亂來的,但總是選擇IOU相對好一些的那個,隨著訓練的進行,每個bounding box會逐漸擅長對某些情況的預測(可能是對象大小、寬高比、不同類型的對象等)。所以,這是一種進化或者非監督學習的思想。
另外論文中經常提到responsible。比如:Our system divides the input image into an S*S grid. If the center of an object falls into a grid cell, that grid cell is responsible for detecting that object. 這個 responsible 有點讓人疑惑,對預測"負責"是啥意思。其實沒啥特別意思,就是一個Object只由一個grid來進行預測,不要多個grid都搶著預測同一個Object。更具體一點說,就是在設置訓練樣本的時候,樣本中的每個Object歸屬到且僅歸屬到一個grid,即便有時Object跨越了幾個grid,也僅指定其中一個。具體就是計算出該Object的bounding box的中心位置,這個中心位置落在哪個grid,該grid對應的輸出向量中該對象的類別概率是1(該gird負責預測該對象),所有其它grid對該Object的預測概率設為0(不負責預測該對象)。
還有:YOLO predicts multiple bounding boxes per grid cell. At training time we only want one bounding box predictor to be responsible for each object. 同樣,雖然一個grid中會產生2個bounding box,但我們會選擇其中一個作為預測結果,另一個會被忽略。下面構造訓練樣本的部分會看的更清楚。
7 * 7網格,每個網格2個bounding box,對448 * 448輸入圖像來說覆蓋粒度有點粗。我們也可以設置更多的網格以及更多的bounding box。設網格數量為 S * S,每個網格產生B個邊框,網路支持識別C個不同的對象。這時,輸出的向量長度為: ,整個輸出的tensor就是: 。
YOLO選擇的參數是 7 7網格,2個bounding box,20種對象,因此 輸出向量長度 = 20 + 2 * (4+1) = 30。整個輸出的tensor就是 7 7*30。
因為網格和bounding box設置的比較稀疏,所以這個版本的YOLO訓練出來後預測的准確率和召回率都不是很理想,後續的v2、v3版本還會改進。當然,因為其速度能夠滿足實時處理的要求,所以對工業界還是挺有吸引力的。
作為監督學習,我們需要先構造好訓練樣本,才能讓模型從中學習。
對於一張輸入圖片,其對應輸出的7 7 30張量(也就是通常監督學習所說的標簽y或者label)應該填寫什麼數據呢。
首先,輸出的 7 7維度 對應於輸入的 7 7 網格。 然後具體看下30維向量的填寫(請對照上面圖6)。
對於輸入圖像中的每個對象,先找到其中心點。比如上圖中的自行車,其中心點在黃色圓點位置,中心點落在黃色網格內,所以這個黃色網格對應的30維向量中,自行車的概率是1,其它對象的概率是0。所有其它48個網格的30維向量中,該自行車的概率都是0。這就是所謂的"中心點所在的網格對預測該對象負責"。狗和汽車的分類概率也是同樣的方法填寫。
訓練樣本的bounding box位置應該填寫對象實際的bounding box,但一個對象對應了2個bounding box,該填哪一個呢?上面討論過,需要根據網路輸出的bounding box與對象實際bounding box的IOU來選擇,所以要在訓練過程中動態決定到底填哪一個bounding box。
上面討論過置信度公式 , 可以直接計算出來,就是用網路輸出的2個bounding box與對象真實bounding box一起計算出IOU。
然後看2個bounding box的IOU,哪個比較大(更接近對象實際的bounding box),就由哪個bounding box來負責預測該對象是否存在,即該bounding box的 ,同時對象真實bounding box的位置也就填入該bounding box。另一個不負責預測的bounding box的 。
總的來說就是,與對象實際bounding box最接近的那個bounding box,其 ,該網格的其它bounding box的 。
舉個例子,比如上圖中自行車的中心點位於4行3列網格中,所以輸出tensor中4行3列位置的30維向量如下圖所示。
翻譯成人話就是:4行3列網格位置有一輛自行車,它的中心點在這個網格內,它的位置邊框是bounding box1所填寫的自行車實際邊框。
注意,圖中將自行車的位置放在bounding box1,但實際上是在訓練過程中等網路輸出以後,比較兩個bounding box與自行車實際位置的IOU,自行車的位置(實際bounding box)放置在IOU比較大的那個bounding box(圖中假設是bounding box1),且該bounding box的置信度設為1。
損失就是網路實際輸出值與樣本標簽值之間的偏差。
YOLO給出的損失函數如下:
其中,
是指網格i存在對象;
是指網格i的第j個bounding box中存在對象;
是指網格i的第j個bounding box中不存在對象。
總的來說,就是用網路輸出與樣本標簽的各項內容的誤差平方和作為一個樣本的整體誤差。 損失函數中的幾個項是與輸出的30維向量中的內容相對應的。
公式第5行,注意 意味著存在對象的網格才計入誤差。
公式第1行和第2行。
a) 都帶有 意味著只有"負責"(IOU比較大)預測的那個bounding box的數據才會計入誤差;
b) 第2行寬度和高度先取了平方根,因為如果直接取差值的話,大的對象對差值的敏感度較低,小的對象對差值的敏感度較高,所以取平方根可以降低這種敏感度的差異,使得較大的對象和較小的對象在尺寸誤差上有相似的權重。
c) 乘以 調節bounding box位置誤差的權重(相對分類誤差和置信度誤差)。YOLO設置 ,即調高位置誤差的權重。
公式第3行和第4行。
a) 第3行是存在對象的bounding box的置信度誤差。帶有 意味著只有"負責"(IOU比較大)預測的那個bounding box的置信度才會計入誤差。
b) 第4行是不存在對象的bounding box的置信度誤差。因為不存在對象的bounding box應該老老實實的說"我這里沒有對象",也就是輸出盡量低的置信度。如果它不恰當的輸出較高的置信度,會與真正"負責"該對象預測的那個bounding box產生混淆。其實就像對象分類一樣,正確的對象概率最好是1,所有其它對象的概率最好是0。
c) 第4行乘以 調節不存在對象的bounding box 的置信度的權重(相對其他誤差)。YOLO設置 ,即調低不存在對象的bounding box的置信度誤差的權重。
YOLO先使用ImageNet數據集對前20層卷積網路進行預訓練,然後使用完整的網路,在PASCAL VOC數據集上進行對象識別和定位的訓練和預測。YOLO的網路結構如下圖所示:
YOLO的最後一層採用線性激活函數,其它層都是Leaky ReLU。訓練中採用了dropout和數據增強(data augmentation)來防止過擬合。更多細節請參考原論文。
訓練好的YOLO網路,輸入一張圖片,將輸出一個 7 7 30 的張量(tensor)來表示圖片中所有網格包含的對象(概率)以及該對象可能的2個位置(bounding box)和可信程度(置信度)。 為了從中提取出最有可能的那些對象和位置,YOLO採用NMS(Non-maximal suppression,非極大值抑制)演算法。
NMS方法並不復雜,其核心思想是:選擇得分最高的作為輸出,與該輸出重疊的去掉,不斷重復這一過程直到所有備選處理完。
YOLO的NMS計算方法如下。
網路輸出的7 * 7 * 30的張量,在每一個網格中,對象 位於第j個bounding box的得分: ,它代表著某個對象 存在第j個bounding box的可能性。
每個網格有:20個對象的概率*2個bounding box的置信度,共40個得分(候選對象)。49個網格共1960個得分。Andrew Ng建議每種對象分別進行NMS,那麼每種對象有 1960/20=98 個得分。
NMS步驟如下:
1)設置一個Score的閾值,低於該閾值的候選對象排除掉(將該Score設為0)
2)遍歷每一個對象類別
2.1)遍歷該對象的98個得分
2.1.1)找到Score最大的那個對象及其bounding box,添加到輸出列表
2.1.2)對每個Score不為0的候選對象,計算其與上面2.1.1輸出對象的bounding box的IOU
2.1.3)根據預先設置的IOU閾值,所有高於該閾值(重疊度較高)的候選對象排除掉(將Score設為0)
2.1.4)如果所有bounding box要麼在輸出列表中,要麼Score=0,則該對象類別的NMS完成,返回步驟2處理下一種對象
3)輸出列表即為預測的對象
YOLO以速度見長,處理速度可以達到45fps,其快速版本(網路較小)甚至可以達到155fps。這得益於其識別和定位合二為一的網路設計,而且這種統一的設計也使得訓練和預測可以端到端的進行,非常簡便。
不足之處是小對象檢測效果不太好(尤其是一些聚集在一起的小對象),對邊框的預測准確度不是很高,總體預測精度略低於Fast RCNN。主要是因為網格設置比較稀疏,而且每個網格只預測兩個邊框,另外Pooling層會丟失一些細節信息,對定位存在影響。
Ⅲ 神經網路演算法如何確定期望輸出值新手求教,謝謝。
把P定義為你期望輸出的那個點的參數矩陣,net為你訓練得到的網路,你可以用sim(net,P)取出期望值。
Ⅳ 神經網路的准確率是怎麼計算的
其實神經網路的准確率的標準是自己定義的。
我把你的例子賦予某種意義講解:
1,期望輸出[1 0 0 1],每個元素代表一個屬性是否存在。像著4個元素分別表示:是否肺炎,是否肝炎,是否腎炎,是否膽炎,1表示是,0表示不是。
2,你的神經網路輸出必定不可能全部都是輸出只有0,1的輸出。絕大部分是像[ 0.9968 0.0000 0.0001 0.9970]這樣的輸出,所以只要輸出中的某個元素大於一定的值,例如0.7,我們就認為這個元素是1,即是有某種炎。否則為0,所以你的[ 0.9968 0.0000 0.0001 0.9970]可以看成是[1,0,0,1],。
3,所以一般神經網路的輸出要按一定的標準定義成另一種輸出(像上面說的),看調整後的輸出和期望輸出是否一致,一致的話算正確,不一致算錯誤。
4,用總量為n的檢驗樣本對網路進行評價,輸出調整後的輸出,統計錯誤的個數,記為m。
所以檢驗正確率可以定義為n/m。
Ⅳ RBF神經網路可以預測質量么
不管你是用RBF還是BP或別的什麼,原理是一樣的。
從根本性質來看,分類問題的答案是二值結果:0或1,對每一個答案,可以進一步做分類,迭代下去就可以得到更細化的分類。
從實現來看,網路產生的分類結果,實際上是一個置信度,它介於0與1間,參數設定置信度大於多少就分類為1,在這一步之間,網路已經得到置信度了,這個置信度就可以作為一個評分,也就是你說的生產質量。
比如你的訓練了一個識別照片與手繪的網路,識別為照片返回1,識別為手繪返回0,那麼,在得到1或0之前,這個網路實際得到的是一個「這張圖是照片的可能性」這就是置信度。那麼,輸出0或1時,這個網路可以稱為「照片/手繪分類網路」,如果輸出置信度,並只輸入手繪圖,此網路可以稱為「寫實手繪評分網路」
搞這一塊的,不能停留在只是簡單使用現有的東西,不把原理搞明白,只能是藍領。
Ⅵ bp神經網路對輸入數據和輸出數據有什麼要求
p神經網路的輸入數據越多越好,輸出數據需要反映網路的聯想記憶和預測能力。
BP網路能學習和存貯大量的輸入-輸出模式映射關系,而無需事前揭示描述這種映射關系的數學方程。它的學習規則是使用最速下降法,通過反向傳播來不斷調整網路的權值和閾值,使網路的誤差平方和最小。
BP神經網路模型拓撲結構包括輸入層(input)、隱層(hide layer)和輸出層(output layer)。BP網路具有高度非線性和較強的泛化能力,但也存在收斂速度慢、迭代步數多、易於陷入局部極小和全局搜索能力差等缺點。
(6)神經網路怎麼輸出置信度擴展閱讀:
BP演算法主要思想是:輸入學習樣本,使用反向傳播演算法對網路的權值和偏差進行反復的調整訓練,使輸出的向量與期望向量盡可能地接近,當網路輸出層的誤差平方和小於指定的誤差時訓練完成,保存網路的權值和偏差。
1、初始化,隨機給定各連接權及閥值。
2、由給定的輸入輸出模式對計算隱層、輸出層各單元輸出
3、計算新的連接權及閥值,計算公式如下:
4、選取下一個輸入模式對返回第2步反復訓練直到網路設輸出誤差達到要求結束訓練。
Ⅶ BP神經網路程序,在程序訓練後,誤差也達到了合適的范圍,如何把輸出值顯示出來
訓練好後,你自己定義的net就是結果,只要把它的權值和閾值導出來即可。
W1=net.IW{1,1};
W2=net.LW{2,1};
B1=net.b{1};
B2=net.b{2};
解釋一下:
net.IW 屬性定義了從網路輸入向量到網路層的權值向量(即輸入層的權值向量)結構。其值為Nl*Ni的細胞矩陣,Nl為網路層數(net.numLayers),Ni為輸入向量數(net.numInputs)。通過訪問net.IW{i,j},可以獲得第i 個網路層來自第j 個輸入向量的權值向量值。 所以一般情況下net,iw{1,1}就是輸入層和隱含層之間的權值。
net.LW定義了從一個網路層到另一個網路層的權值向量結構。其值為Nl*Nl的細胞矩陣,Nl為網路層數(net.numLayers)。通過訪問net.LW{i,j},可以獲得第i 個網路層來自第j 個網路層的權值向量值。 因此,如果網路是單隱含層,net.lw{2,1}就是輸出層和隱含層之間的權值。