作者guestttttt (长常久九)
看板DataScience
标题[问题] 图片分类有狗/没有狗,画Saliency map
时间Sat Jul 7 10:40:47 2018
作业系统: 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://webptt.com/cn.aspx?n=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