學如不及,猶恐失之啊! 沒時間不是藉口,還是得趁有空時把研究的東西記下來,以免之後忘記。
用deep learning做classification時,結果總是每一類的機率,但是到底NN是從圖像的哪個部分判斷出他是屬於哪一類的機率呢? 這時候就可以用classificaiton的visualization來幫助我們確認NN有學習到我們認為應該要學到的部分了。
主要有兩總方法:
這裡介紹:
Learning Deep Features for Discriminative Localization
主要概念可以這樣想,我們在output最後一層conv時,其實已經隱含了每個class的權重,而對於每一個NN我們在最後做fine-tuning之後加上一個Global Average Polling (GAP)層+ Dense層來求得feature map對於每一類的weight,然後利用這組weight挑選想要做Activation Map的Cass後,乘上最後一層feature map,疊加起來就可以知道相對於這個Class的Activation Map,所以對於任何網路,只要在想要可視化的conv層後加上GAP,就可以實現可視化。
具體公式如下:

fk(x,y)代表了空間座標上x, y的feature map value,Fk代表了做完GAP之後的結果
接著對於每一類(小寫c)的weight(W)的output結果,我們可以寫出如下公式:

具體來說就是weight乘上GAP的結果,Sc就是類的預測結果,這時我們可以發現(1)式,weight可以直接乘上feature map:

(2)的Mc(x,y)就是疊加後的activation map。
配合這裡的實作講解,將自己的dataset配置一下,即便可以完成實作自己train的model的Activation Map,但Keras 的坑有點多,首先會遇上第一個坑: order of shape not match,主要是因為pre train model是用Theano build的,但我是用Tensorflow當backend,所以model的結構會有點不一樣,所以要加上"",但仍會有錯這裡我找不到解法了,改成用Keras 1.2.2就過了,殘念,有空再去查原因為何。
Prediction時會遇到第二個坑,說我們沒有feed LEARNING_PHASE這個參數,主要是因為我們使用tensorflow backend,有需參數設置是必須的,在predict時加上:
#We didn't use it in training mode (parameter 1), because there will converge very slowly
K.set_learning_phase(0)
查Api 0代表test mode,1代表training mode,traing不需加上.
Ok,pass了. 別高興太早,第三個坑會遇到optimizer_weights的problem.
網路上分享比較快的作法是直接delete掉optimizer_weights,算是一個workaround:
f = h5py.File(camconfig.VIS_MODEL_PATH, 'r+')
if 'optimizer_weights' in f:
del f['optimizer_weights']
f.close()
下面就看看結果啦,我是用inception v3對自己的dataset做fine-tuning, dataset一共有四個類別(front, side, back, mask),下面的Class結果是人像正面,可以看出判斷是否為人像的正面還是取決於臉部的特徵.

沒有留言:
張貼留言