[問題] 圖片分類有狗/沒有狗,畫Saliency map
作業系統: win 7
問題類別: CNN, Saliency map
使用工具: python,tensorflow,keras
問題內容:
我用SqueezeNet 的架構,重新訓練model,再用keras.backend.gradients畫Saliency map。
但我不確定畫出來的Saliency map 對不對。
測試一:訓練model 分辨鳥、貓、狗
給model 狗(或貓、鳥)的圖片,Saliency map正確顯示的物體位置
如下圖,上排是原圖,下排是Saliency map,紅點是物體位置
https://imgur.com/bjmOxH6
測試二:訓練model ,分辨圖片中有狗/沒有狗
給model 有狗或沒狗的圖片,Saliency map亂標示一個位置或一片黑(數值全為0)
如下圖,上排是原圖,下排是Saliency map,白點是程式標示的位置
https://imgur.com/wCXVSBC
如果繼續訓練到overfit,則是變成下圖
https://imgur.com/y0jlqag
請問測試二是對的嗎?
我的程式碼如下,請各位指點看是不是哪裡有錯
如果要做成有狗的時候標出位置,沒有狗的時候不標位置,該怎麼修改
謝謝
from keras import backend as k
import numpy as np
...讀取圖片,略...
modela = load_model('../isdog.h5')
yinput = Input(shape=(classnum,)) #這裡分兩類,classnum是2
loss = k.categorical_crossentropy(yinput, modela.output, from_logits=True)
gradients = k.gradients(loss, modela.inputs[0])
runnn = k.function(inputs=[modela.input, yinput], outputs=gradients)
smap = runnn([testimage, to_categorical(truelabel, classnum)])[0]
smap = np.absolute(smap)
smap = np.amax(smap, axis=3)
...matplot畫圖,略...
====================================================================
自問自答
後來在程式發現兩個錯誤
一個是我在輸入時對圖片多做一個處理,但訓練model沒有做這個處理
另一個是,gradients是用輸出分數(未normalize)對圖片微分,不是loss對圖片微分
修正後,分辨有狗/沒狗就可以畫出saliency map了
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 27.105.49.128
※ 文章網址: https://www.ptt.cc/bbs/DataScience/M.1530931251.A.860.html
※ 編輯: guestttttt (27.105.49.128), 07/08/2018 09:35:25
※ 編輯: guestttttt (27.105.49.128), 07/14/2018 12:27:27
DataScience 近期熱門文章
PTT數位生活區 即時熱門文章