0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

CAM與Grad-CAM++可視化CNN方式的代碼實(shí)現(xiàn)和對(duì)比

冬至子 ? 來(lái)源:Tanishq Sardana ? 作者:Tanishq Sardana ? 2023-06-09 16:53 ? 次閱讀

當(dāng)使用神經(jīng)網(wǎng)絡(luò)時(shí),我們可以通過(guò)它的準(zhǔn)確性來(lái)評(píng)估模型的性能,但是當(dāng)涉及到計(jì)算機(jī)視覺(jué)問(wèn)題時(shí),不僅要有最好的準(zhǔn)確性,還要有可解釋性和對(duì)哪些特征/數(shù)據(jù)點(diǎn)有助于做出決策的理解。模型專(zhuān)注于正確的特征比模型的準(zhǔn)確性更重要。

理解CNN的方法主要有類(lèi)激活圖(Class Activation Maps, CAM)、梯度加權(quán)類(lèi)激活圖(Gradient Weighted Class Activation Mapping, Grad-CAM)和優(yōu)化的 Grad-CAM( Grad-CAM++)。它們的思想都是一樣的:如果我們?nèi)∽詈笠粋€(gè)卷積層的輸出特征映射并對(duì)它們施加權(quán)重,就可以得到一個(gè)熱圖,可以表明輸入圖像中哪些部分的權(quán)重高(代表了整個(gè)圖的特征)。

Class Activation Maps

CAM是一種將CNN所看到或關(guān)注的內(nèi)容可視化并為我們生成類(lèi)輸出的方法。

通過(guò)將圖像傳遞給CNN,我們獲得了相同圖像的低分辨率特征圖。

CAM的思想是,刪除那些完全連接的神經(jīng)網(wǎng)絡(luò),并用全局平均池化層代替它們,特征圖中所有像素的平均值就是它的全局平均值。通過(guò)將GAP應(yīng)用于所有特征映射將獲得它們的標(biāo)量值。

對(duì)于這些標(biāo)量值,我們應(yīng)用表明每個(gè)特征映射對(duì)特定類(lèi)重要性的權(quán)重,權(quán)重是通過(guò)訓(xùn)練一個(gè)線(xiàn)性模型來(lái)學(xué)習(xí)的。

激活圖將是所有這些特征圖的加權(quán)組合。

defgenerate_cam(input_model, image, layer_name='block5_conv3', H=224, W=224):
     
     cls=np.argmax(input_model.predict(image)) # Obtain the predicted class
     conv_output=input_model.get_layer(layer_name).output#Get the weights of the last output layer
     
     last_conv_layer_model=keras.Model(input_model.inputs, conv_output) #Create a model with the last output layer    
     class_weights=input_model.get_layer(layer_name).get_weights()[0] # Get the weights of the output layer\\
     class_weights=class_weights[0,:,:,:]
     class_weights=np.mean(class_weights, axis=(0, 1))
     
     
     last_conv_output=last_conv_layer_model.predict(image) #The feature map output from last output layer
     last_conv_output=last_conv_output[0, :]
     cam=np.dot(last_conv_output, class_weights)
     
     
     cam=zoom(cam, H/cam.shape[0]) #Spatial Interpolation/zooming to image size
     cam=cam/np.max(cam) #Normalizing the gradcam
     
     returncam

但是CAM有一個(gè)最大的缺點(diǎn)就是必須重新訓(xùn)練模型才能得到全局平均池化后得到的權(quán)重。對(duì)于每一類(lèi)必須學(xué)習(xí)一個(gè)線(xiàn)性模型。也就是說(shuō)將有n個(gè)權(quán)重(等于最后一層的過(guò)濾器)* n個(gè)線(xiàn)性模型(等于類(lèi))。并且還必須修改網(wǎng)絡(luò)架構(gòu)來(lái)創(chuàng)建CAM這對(duì)于現(xiàn)有的模型來(lái)說(shuō)改動(dòng)太大,所以Grad-CAM解決了這些缺點(diǎn)。

Grad-CAM( Gradient Weighted Class Activation Mapping)

Grad-CAM背后的思想是,依賴(lài)于最后一個(gè)卷積層的特征映射中使用的梯度,而不是使用網(wǎng)絡(luò)權(quán)重。這些梯度是通過(guò)反向傳播得到的。

這不僅解決了再訓(xùn)練問(wèn)題,還解決了網(wǎng)絡(luò)架構(gòu)修改問(wèn)題,因?yàn)橹皇褂锰荻榷皇褂肎AP層。

我們只要在最后一個(gè)卷積層中計(jì)算用于頂部預(yù)測(cè)類(lèi)的特征映射的梯度。然后我們對(duì)這些權(quán)重應(yīng)用全局平均。權(quán)重與最后一層得到的特征映射的點(diǎn)積就是Grad-CAM輸出。然后通過(guò)在其上應(yīng)用ReLU,識(shí)別圖像中僅對(duì)我們的圖像有積極貢獻(xiàn)的部分。

最后就是將Grad-CAM調(diào)整為圖像大小并規(guī)范化,以便它可以疊加在圖像上。

defgrad_cam(input_model, image, layer_name='block5_conv3',H=224,W=224):
     
     cls=np.argmax(input_model.predict(image)) #Get the predicted class
     y_c=input_model.output[0, cls] #Probability Score
     conv_output=input_model.get_layer(layer_name).output#Tensor of the last layer of cnn
     grads=K.gradients(y_c, conv_output)[0] #Gradients of the predicted class wrt conv_output layer
     
     get_output=K.function([input_model.input], [conv_output, grads]) 
     output, grads_val=get_output([image]) #Gives output of image till conv_output layer and the gradient values at that level
     output, grads_val=output[0, :], grads_val[0, :, :, :]
     
     
     weights=np.mean(grads_val, axis=(0, 1)) #Mean of gradients which acts as our weights
     cam=np.dot(output, weights) #Grad-CAM output
     
     cam=np.maximum(cam, 0) #Applying Relu
     cam=zoom(cam,H/cam.shape[0]) #Spatial Interpolation/zooming to image size
     cam=cam/cam.max() #Normalizing the gradcam
     
     returncam

Grad-CAM++

Grad-CAM++不僅包括gradcam技術(shù),它增加了引導(dǎo)反向傳播,只通過(guò)類(lèi)別預(yù)測(cè)的正梯度進(jìn)行反向傳播。

Grad-CAM++這種優(yōu)化的原因是因?yàn)镚rad-CAM在識(shí)別和關(guān)注多次出現(xiàn)的對(duì)象或具有低空間占用的對(duì)象方面存在問(wèn)題。

所以Grad-CAM++給予與預(yù)測(cè)類(lèi)相關(guān)的梯度像素更多的重要性(正梯度),通過(guò)使用更大的因子而不是像Grad-CAM那樣使用常數(shù)因子來(lái)縮放它們。這個(gè)比例因子在代碼中用alpha表示。

defgrad_cam_plus(input_model, image, layer_name='block5_conv3',H=224,W=224):
     
     cls=np.argmax(input_model.predict(image))
     y_c=input_model.output[0, cls]
     conv_output=input_model.get_layer(layer_name).output
     grads=K.gradients(y_c, conv_output)[0]
     
     first=K.exp(y_c)*grads#Variables used to calculate first second and third gradients
     second=K.exp(y_c)*grads*grads
     third=K.exp(y_c)*grads*grads*grads
 
     #Gradient calculation
     get_output=K.function([input_model.input], [y_c,first,second,third, conv_output, grads])
     y_c, conv_first_grad, conv_second_grad,conv_third_grad, conv_output, grads_val=get_output([img])
     global_sum=np.sum(conv_output[0].reshape((-1,conv_first_grad[0].shape[2])), axis=0)
 
     #Used to calculate the alpha values for each spatial location
     alpha_num=conv_second_grad[0]
     alpha_denom=conv_second_grad[0]*2.0+conv_third_grad[0]*global_sum.reshape((1,1,conv_first_grad[0].shape[2]))
     alpha_denom=np.where(alpha_denom!=0.0, alpha_denom, np.ones(alpha_denom.shape))
     alphas=alpha_num/alpha_denom
     
     #Calculating the weights and alpha's which is the scale at which we multiply the weights with more importance
     weights=np.maximum(conv_first_grad[0], 0.0)
     alpha_normalization_constant=np.sum(np.sum(alphas, axis=0),axis=0)
     alphas/=alpha_normalization_constant.reshape((1,1,conv_first_grad[0].shape[2])) #Normalizing alpha
     
     #Weights with alpha multiplied to get spatial importance
     deep_linearization_weights=np.sum((weights*alphas).reshape((-1,conv_first_grad[0].shape[2])),axis=0)
     
     grad_CAM_map=np.sum(deep_linearization_weights*conv_output[0], axis=2) #Grad-CAM++ map
     cam=np.maximum(grad_CAM_map, 0)
     cam=zoom(cam,H/cam.shape[0])
     cam=cam/np.max(cam) 
     
     returncam

結(jié)果對(duì)比

這里我們使用VGG16,對(duì)一些圖像進(jìn)行了比較,下圖中可以看到CAM、Grad-CAM和Grad-CAM++的看法有多么不同。雖然它們都主要集中在它的上半身,但Grad-CAM++能夠?qū)⑵湔w視為重要部分,而CAM則將其某些部分視為非常重要的特征,而將一些部分視為其預(yù)測(cè)的輔助。而Grad-CAM只關(guān)注它的冠和翅膀作為決策的重要特征。

對(duì)于這張風(fēng)箏的圖像,CAM顯示它關(guān)注的是除了風(fēng)箏之外的所有東西(也就是天空),但是使用gradcam則看到到模型關(guān)注的是風(fēng)箏,而gradcam ++通過(guò)增加重要的突出空間進(jìn)一步加強(qiáng)了這一點(diǎn)。這里需要注意的是,模型錯(cuò)誤地將其分類(lèi)為降落傘,但風(fēng)箏類(lèi)緊隨其后。也就是說(shuō),其實(shí)CAM更好的捕捉到了錯(cuò)誤的原因。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 神經(jīng)網(wǎng)絡(luò)

    關(guān)注

    42

    文章

    4810

    瀏覽量

    102905
  • 過(guò)濾器
    +關(guān)注

    關(guān)注

    1

    文章

    436

    瀏覽量

    20255
  • 計(jì)算機(jī)視覺(jué)

    關(guān)注

    9

    文章

    1706

    瀏覽量

    46590
  • GAP
    GAP
    +關(guān)注

    關(guān)注

    0

    文章

    15

    瀏覽量

    8456
收藏 0人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    單片機(jī)可視化編程

    單片機(jī)的可視化編程是不是指在環(huán)境下避開(kāi)復(fù)雜的指令編寫(xiě)而通過(guò)圖形的方式產(chǎn)生指令代碼?-在可視化的條件下是否可以觀察到仿真的結(jié)果?是的。不過(guò)仿真的結(jié)果不能夠直接觀察到,而要通過(guò)將生成的
    發(fā)表于 07-08 16:56

    可視化MES系統(tǒng)軟件

    和客戶(hù)都會(huì)造成損失,為了更好的滿(mǎn)足客戶(hù)需求、實(shí)現(xiàn)企業(yè)信息,目前企業(yè)制造過(guò)程中主要還存在以下需求:(1)數(shù)據(jù)可視化方面。MES系統(tǒng)軟件之所以能有效的監(jiān)控整個(gè)車(chē)間的生產(chǎn)過(guò)程,主要是通過(guò)對(duì)制造過(guò)程中
    發(fā)表于 11-30 19:55

    利用Keras實(shí)現(xiàn)四種卷積神經(jīng)網(wǎng)絡(luò)(CNN)可視化

    Keras實(shí)現(xiàn)卷積神經(jīng)網(wǎng)絡(luò)(CNN)可視化
    發(fā)表于 07-12 11:01

    python數(shù)據(jù)可視化的方法和代碼

    Python數(shù)據(jù)可視化匯總
    發(fā)表于 10-14 14:59

    三維可視化的應(yīng)用和優(yōu)勢(shì)

    的整體態(tài)勢(shì)?! ”热缭O(shè)備在偏僻區(qū)域(海下、深山、沙漠、分布全國(guó)各地等),可以實(shí)現(xiàn)無(wú)人檢測(cè),無(wú)需消耗人力物力進(jìn)行檢測(cè),通過(guò)三維數(shù)據(jù)的分析可以直觀的探測(cè)出設(shè)備狀態(tài)和產(chǎn)能。  設(shè)備運(yùn)行可視化:根據(jù)圖像
    發(fā)表于 12-02 11:52

    基于VSCode的嵌入式開(kāi)發(fā)的可視化代碼調(diào)試方法分享

    ,經(jīng)常會(huì)遇到問(wèn)題不是那么明顯,不方便通過(guò)加打印的方式進(jìn)行排查的問(wèn)題,并且加打印排查的方式較為低效,使得調(diào)試過(guò)程極為痛苦。可視化調(diào)試效率一直比命令行調(diào)試要方便和快捷很多,而嵌入式開(kāi)發(fā)由于目標(biāo)程序在開(kāi)發(fā)板上,而不在編寫(xiě)
    發(fā)表于 12-14 07:54

    如何在Ubuntu下實(shí)現(xiàn)可視化代碼跟蹤調(diào)試

    目錄一、在Ubuntu下實(shí)現(xiàn)可視化代碼跟蹤調(diào)試1.1 安裝VSCode1.2 配置調(diào)試和編譯文件一、在Ubuntu下實(shí)現(xiàn)可視化
    發(fā)表于 12-14 07:02

    Keras可視化神經(jīng)網(wǎng)絡(luò)架構(gòu)的4種方法

    pip install graphviz然后我們創(chuàng)建一個(gè)模型,并用這4個(gè)包來(lái)進(jìn)行可視化:在實(shí)際使用時(shí)我們希望的是通過(guò)可視化來(lái)對(duì)比模型架構(gòu),所以這里定義三個(gè)具有不同超參數(shù) CNN 模型
    發(fā)表于 11-02 14:55

    CAM工序自動(dòng)說(shuō)明

    CAM工序自動(dòng) 雖然CAM系統(tǒng)在PCB業(yè)界中不斷增加,但是為甚么還有很多廠商不愿意把工序自動(dòng)
    發(fā)表于 01-28 23:40 ?0次下載

    基于模板的通用文件對(duì)話(huà)框的可視化定制

    本文介紹了利用模板可視化定制通用文件對(duì)話(huà)框的實(shí)現(xiàn)方法。關(guān)鍵詞: 定制;通用文件對(duì)話(huà)框;模板;預(yù)覽在我們開(kāi)發(fā)的CAD/CAM系統(tǒng)及其它應(yīng)用軟件中,經(jīng)常需要用戶(hù)進(jìn)行一些
    發(fā)表于 08-21 10:08 ?14次下載

    CAM工序自動(dòng)

    CAM工序自動(dòng)CAM工序自動(dòng)CAM工序自動(dòng)CAM
    發(fā)表于 02-24 11:02 ?0次下載

    管線(xiàn)可視化管理怎么實(shí)現(xiàn)呢?

    無(wú)論是城市管線(xiàn)還是社區(qū),商場(chǎng),大廈里的管線(xiàn),想要實(shí)時(shí)檢測(cè)到管線(xiàn)的情況怕是有難度。如何通過(guò)物聯(lián)網(wǎng)和互聯(lián)網(wǎng)技術(shù)實(shí)現(xiàn)管線(xiàn)可視化管理是解決問(wèn)題的根本。 智慧電力可視化系統(tǒng)構(gòu)建發(fā)電、輸電、變電、配電、用電
    發(fā)表于 03-11 14:36 ?1428次閱讀

    CNN的三種可視化方法介紹

    導(dǎo)讀 對(duì)神經(jīng)網(wǎng)絡(luò)進(jìn)行可視化分析不管是在學(xué)習(xí)上還是實(shí)際應(yīng)用上都有很重要的意義,基于此,本文介紹了3種CNN可視化方法:可視化中間特征圖,可視化
    的頭像 發(fā)表于 12-29 11:49 ?2652次閱讀

    3種CNN可視化方法

    上圖為某CNN 5-8 層輸出的某喵星人的特征圖的可視化結(jié)果(一個(gè)卷積核對(duì)應(yīng)一個(gè)小圖片)??梢园l(fā)現(xiàn)越是低的層,捕捉的底層次像素信息越多,特征圖中貓的輪廓也越清晰。越到高層,圖像越抽象,稀疏程度也越高。這符合我們一直強(qiáng)調(diào)的特征提取概念。
    的頭像 發(fā)表于 01-07 14:36 ?2195次閱讀

    基于Grad-CAM與KL損失的SSD目標(biāo)檢測(cè)算法

    基于Grad-CAM與KL損失的SSD目標(biāo)檢測(cè)算法 來(lái)源:《電子學(xué)報(bào)》,作者侯慶山等 摘 要:?鑒于Single Shot Multibox Detector (SSD)算法對(duì)中小目標(biāo)檢測(cè)
    發(fā)表于 01-21 08:40 ?1124次閱讀

    電子發(fā)燒友

    中國(guó)電子工程師最喜歡的網(wǎng)站

    • 2931785位工程師會(huì)員交流學(xué)習(xí)
    • 獲取您個(gè)性化的科技前沿技術(shù)信息
    • 參加活動(dòng)獲取豐厚的禮品