国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

《python深度學習》筆記(二十):神經(jīng)網(wǎng)絡的解釋方法之CAM、Grad-CAM、Grad-CAM++、LayerCAM

這篇具有很好參考價值的文章主要介紹了《python深度學習》筆記(二十):神經(jīng)網(wǎng)絡的解釋方法之CAM、Grad-CAM、Grad-CAM++、LayerCAM。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

原理 優(yōu)點 缺點
GAP 將多維特征映射降維為一個固定長度的特征向量 ①減少了模型的參數(shù)量;②保留更多的空間位置信息;③可并行計算,計算效率高;④具有一定程度的不變性 ①可能導致信息的損失;②忽略不同尺度的空間信息
CAM 利用最后一個卷積層的特征圖×權重(用GAP代替全連接層,重新訓練,經(jīng)過GAP分類后概率最大的神經(jīng)元的權重 效果已經(jīng)很不錯 需要修改原模型的結構,導致需要重新訓練該模型,大大限制了使用場景,如果模型已經(jīng)上線了,或著訓練的成本非常高,我們幾乎是不可能為了它重新訓練的。
Grad-CAM 最后一個卷積層的特征圖×權重(通過對特征圖梯度的全局平均來計算權重 ①解決了CAM的缺點,適用于任何卷積神經(jīng)網(wǎng)絡;②利用特征圖的梯度,可視化結果更準確和精細
Grad-CAM++ 1. 定位更準確
2. 更適合同類多目標的情況

目錄

GAP全局平均池化

CAM

Grad-CAM?

Grad-CAM++


GAP全局平均池化

論文:Network In Network

GAP (Global Average Pooling,全局平均池化),在上述論文中提出,用于避免全連接層的過擬合問題。全局平均池化就是對整個特征映射應用平均池化。

《python深度學習》筆記(二十):神經(jīng)網(wǎng)絡的解釋方法之CAM、Grad-CAM、Grad-CAM++、LayerCAM,《python深度學習》筆記,深度學習,神經(jīng)網(wǎng)絡

圖1:將原本h × w × d的三維特征圖,具體大小為6 × 6 × 3,經(jīng)過GAP池化為1 × 1 × 3 輸出值。也就是每一個channel的h × w 平均池化為一個值。特征圖經(jīng)過 GAP 處理后每一個特征圖包含了不同類別的信息。?

GAP平均池化的操作步驟如下:

  1. 經(jīng)過卷積操作和激活函數(shù)后,得到最后一個卷積層的特征圖。
  2. 對每個通道的特征圖進行平均池化,即計算每個通道上所有元素的平均值。這將每個通道的特征圖轉化為一個標量值。
  3. 將每個通道的標量值組合成一個特征向量。這些標量值的順序與通道的順序相同。
  4. 最終得到的特征向量可以作為分類器的輸入,用于進行圖像分類。

CAM

論文:Learning Deep Features for Discriminative Localization

原理:利用最后一個卷積層的特征圖與經(jīng)過GAP分類后概率最大的神經(jīng)元權重進行疊加。

圖2:解釋了在CNN中使用全局平均池化(GAP)生成類激活映射(CAM)的過程:

《python深度學習》筆記(二十):神經(jīng)網(wǎng)絡的解釋方法之CAM、Grad-CAM、Grad-CAM++、LayerCAM,《python深度學習》筆記,深度學習,神經(jīng)網(wǎng)絡

經(jīng)過最后一層卷積操作之后,得到的特征圖包含多個channel,如圖1中的不同顏色的3個channel,也就是在GAP之前所對應的不同的channel特征圖,就表示第k個channel的特征圖。然后經(jīng)過GAP處理后每個channel的特征圖包含了不同類別的信息,就表示分類概率最大的神經(jīng)元(圖2黑色神經(jīng)元)所對應連接的第k個神經(jīng)元的權重。

Grad-CAM?

Grad-CAM: Visual Explanations from Deep Networks via Gradient-based Localization (arxiv.org)

Grad-CAM的前身是?CAM,CAM 的基本的思想是求分類網(wǎng)絡某一類別得分對高維特征圖 (卷積層的輸出) 的偏導數(shù),從而可以得到該高維特征圖每個通道對該類別得分的權值;而高維特征圖的激活信息 (正值) 又代表了卷積神經(jīng)網(wǎng)絡的所感興趣的信息,加權后使用熱力圖呈現(xiàn)得到 CAM。

原理:Grad-CAM的關鍵思想是將輸出類別的梯度(相對于特定卷積層的輸出)與該層的輸出相乘,然后取平均,得到一個“粗糙”的熱力圖。這個熱力圖可以被放大并疊加到原始圖像上,以顯示模型在分類時最關注的區(qū)域。

具體步驟如下:

  1. 選擇網(wǎng)絡的最后一個卷積層,因為它既包含了高級特征,也保留了空間信息。
  2. 前向傳播圖像到網(wǎng)絡,得到你想解釋的類別的得分。
  3. 計算此得分相對于我們選擇的卷積層輸出的梯度。
  4. 對于該卷積層的每個通道,使用上述梯度的全局平均值對該通道進行加權。
  5. 結果是一個與卷積層的空間維度相同的加權熱力圖。

《python深度學習》筆記(二十):神經(jīng)網(wǎng)絡的解釋方法之CAM、Grad-CAM、Grad-CAM++、LayerCAM,《python深度學習》筆記,深度學習,神經(jīng)網(wǎng)絡

《python深度學習》筆記(二十):神經(jīng)網(wǎng)絡的解釋方法之CAM、Grad-CAM、Grad-CAM++、LayerCAM,《python深度學習》筆記,深度學習,神經(jīng)網(wǎng)絡

因為熱力圖關心的是對分類有正面影響的特征,所以在線性組合的技術上加上了ReLU,以移除負值?。

《python深度學習》筆記(二十):神經(jīng)網(wǎng)絡的解釋方法之CAM、Grad-CAM、Grad-CAM++、LayerCAM,《python深度學習》筆記,深度學習,神經(jīng)網(wǎng)絡

第 k 個特征圖對應于類別 c 的權重,
表示:第?k 個特征圖,
表示特征圖的像素個數(shù),
表示: 第c類得分的梯度,
表示: 第 k個特征圖中坐標( i , j )位置處的像素值;

Grad-CAM代碼:

import torch
import cv2
import torch.nn.functional as F
import torchvision.transforms as transforms
import matplotlib.pyplot as plt
from PIL import Image
 
class GradCAM:
    def __init__(self, model, target_layer):
        self.model = model  # 要進行Grad-CAM處理的模型
        self.target_layer = target_layer  # 要進行特征可視化的目標層
        self.feature_maps = None  # 存儲特征圖
        self.gradients = None  # 存儲梯度
        
        # 為目標層添加鉤子,以保存輸出和梯度
        target_layer.register_forward_hook(self.save_feature_maps)
        target_layer.register_backward_hook(self.save_gradients)
 
    def save_feature_maps(self, module, input, output):
        """保存特征圖"""
        self.feature_maps = output.detach()
 
    def save_gradients(self, module, grad_input, grad_output):
        """保存梯度"""
        self.gradients = grad_output[0].detach()
 
    def generate_cam(self, image, class_idx=None):
        """生成CAM熱力圖"""
        # 將模型設置為評估模式
        self.model.eval()
        
        # 正向傳播
        output = self.model(image)
        if class_idx is None:
            class_idx = torch.argmax(output).item()
 
        # 清空所有梯度
        self.model.zero_grad()
 
        # 對目標類進行反向傳播
        one_hot = torch.zeros((1, output.size()[-1]), dtype=torch.float32)
        one_hot[0][class_idx] = 1
        output.backward(gradient=one_hot.cuda(), retain_graph=True)
 
        # 獲取平均梯度和特征圖
        pooled_gradients = torch.mean(self.gradients, dim=[0, 2, 3])
        activation = self.feature_maps.squeeze(0)
        for i in range(activation.size(0)):
            activation[i, :, :] *= pooled_gradients[i]
        
        # 創(chuàng)建熱力圖
        heatmap = torch.mean(activation, dim=0).squeeze().cpu().numpy()
        heatmap = np.maximum(heatmap, 0)
        heatmap /= torch.max(heatmap)
        heatmap = cv2.resize(heatmap, (image.size(3), image.size(2)))
        heatmap = np.uint8(255 * heatmap)
        heatmap = cv2.applyColorMap(heatmap, cv2.COLORMAP_JET)
        
        # 將熱力圖疊加到原始圖像上
        original_image = self.unprocess_image(image.squeeze().cpu().numpy())
        superimposed_img = heatmap * 0.4 + original_image
        superimposed_img = np.clip(superimposed_img, 0, 255).astype(np.uint8)
        
        return heatmap, superimposed_img
 
    def unprocess_image(self, image):
        """反預處理圖像,將其轉回原始圖像"""
        mean = np.array([0.485, 0.456, 0.406])
        std = np.array([0.229, 0.224, 0.225])
        image = (((image.transpose(1, 2, 0) * std) + mean) * 255).astype(np.uint8)
        return image
 
def visualize_gradcam(model, input_image_path, target_layer):
    """可視化Grad-CAM熱力圖"""
    # 加載圖像
    img = Image.open(input_image_path)
    preprocess = transforms.Compose([
        transforms.Resize((224, 224)),
        transforms.ToTensor(),
        transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
    ])
    input_tensor = preprocess(img).unsqueeze(0).cuda()
 
    # 創(chuàng)建GradCAM
    gradcam = GradCAM(model, target_layer)
    heatmap, result = gradcam.generate_cam(input_tensor)
 
    # 顯示圖像和熱力圖
    plt.figure(figsize=(10,10))
    plt.subplot(1,2,1)
    plt.imshow(heatmap)
    plt.title('熱力圖')
    plt.axis('off')
    plt.subplot(1,2,2)
    plt.imshow(result)
    plt.title('疊加后的圖像')
    plt.axis('off')
    plt.show()
 
# 以下是示例代碼,顯示如何使用上述代碼。
# 首先,你需要加載你的模型和權重。
# model = resnet20()
# model.load_state_dict(torch.load("path_to_your_weights.pth"))
# model.to('cuda')
 
# 然后,調用`visualize_gradcam`函數(shù)來查看結果。
# visualize_gradcam(model, "path_to_your_input_image.jpg", model.layer3[-1])

?Grad-CAM++

Grad-CAM++: Improved Visual Explanations for Deep Convolutional Networks (arxiv.org)?

《python深度學習》筆記(二十):神經(jīng)網(wǎng)絡的解釋方法之CAM、Grad-CAM、Grad-CAM++、LayerCAM,《python深度學習》筆記,深度學習,神經(jīng)網(wǎng)絡文章來源地址http://www.zghlxwxcb.cn/news/detail-742930.html

到了這里,關于《python深度學習》筆記(二十):神經(jīng)網(wǎng)絡的解釋方法之CAM、Grad-CAM、Grad-CAM++、LayerCAM的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • Python中的深度學習:神經(jīng)網(wǎng)絡與卷積神經(jīng)網(wǎng)絡

    Python中的深度學習:神經(jīng)網(wǎng)絡與卷積神經(jīng)網(wǎng)絡

    當下,深度學習已經(jīng)成為人工智能研究和應用領域的關鍵技術之一。作為一個開源的高級編程語言,Python提供了豐富的工具和庫,為深度學習的研究和開發(fā)提供了便利。本文將深入探究Python中的深度學習,重點聚焦于神經(jīng)網(wǎng)絡與卷積神經(jīng)網(wǎng)絡的原理和應用。 深度學習是機器學

    2024年02月08日
    瀏覽(31)
  • 《動手學深度學習》學習筆記 第9章 現(xiàn)代循環(huán)神經(jīng)網(wǎng)絡

    《動手學深度學習》學習筆記 第9章 現(xiàn)代循環(huán)神經(jīng)網(wǎng)絡

    書籍鏈接: 動手學深度學習 筆記是從第四章開始,前面三章為基礎知識,有需要的可以自己去看看 關于本系列筆記: 書里為了讓讀者更好的理解,有大篇幅的描述性的文字,內容很多,筆記只保留主要內容,同時也是對之前知識的查漏補缺 《動手學深度學習》學習筆記 第

    2024年01月18日
    瀏覽(34)
  • 基于 Python中的深度學習:神經(jīng)網(wǎng)絡與卷積神經(jīng)網(wǎng)絡

    基于 Python中的深度學習:神經(jīng)網(wǎng)絡與卷積神經(jīng)網(wǎng)絡

    當下,深度學習已經(jīng)成為人工智能研究和應用領域的關鍵技術之一。作為一個開源的高級編程語言,Python提供了豐富的工具和庫,為深度學習的研究和開發(fā)提供了便利。本文將深入探究Python中的深度學習,重點聚焦于神經(jīng)網(wǎng)絡與卷積神經(jīng)網(wǎng)絡的原理和應用。 深度學習是機器學

    2024年02月07日
    瀏覽(95)
  • 《Pytorch深度學習和圖神經(jīng)網(wǎng)絡(卷 2)》學習筆記——第一章

    《Pytorch深度學習和圖神經(jīng)網(wǎng)絡(卷 2)》學習筆記——第一章

    PyTorch深度學習和圖神經(jīng)網(wǎng)絡(卷2)——開發(fā)應用一書配套代碼: https://github.com/aianaconda/pytorch-GNN-2nd- 百度網(wǎng)盤鏈接:https://pan.baidu.com/s/1dnq5IbFjjdekAR54HLb9Pg 提取碼:k7vi 壓縮包密碼:dszn 2012年起,在ILSVRC競賽中獲得冠軍的模型如下 2012年:AlexNet 2013年:OverFeat 2014年:GoogLeNet、

    2024年02月16日
    瀏覽(17)
  • 《Pytorch深度學習和圖神經(jīng)網(wǎng)絡(卷 1)》學習筆記——第七章

    《Pytorch深度學習和圖神經(jīng)網(wǎng)絡(卷 1)》學習筆記——第七章

    這一章內容有點豐富,多用了一些時間,實例就有四五個。 這章內容是真多?。。▽W完之后又回到開頭感嘆) 將圖像從基礎像素到局部信息再到整體信息 即將圖片由低級特征到高級特征進行逐級計算,逐級累計。 計算機中對圖片的處理可以理解為離散微積分的過程。 利用

    2024年02月12日
    瀏覽(21)
  • 【AI】《動手學-深度學習-PyTorch版》筆記(十八):卷積神經(jīng)網(wǎng)絡模型

    【AI】《動手學-深度學習-PyTorch版》筆記(十八):卷積神經(jīng)網(wǎng)絡模型

    發(fā)布時間:1989年 模型目的:識別手寫數(shù)字 1.3.1 相關函數(shù)原型 1)nn.Conv2d:卷積層

    2024年02月13日
    瀏覽(90)
  • 【AI】《動手學-深度學習-PyTorch版》筆記(十七):卷積神經(jīng)網(wǎng)絡入門

    我們在前面學習的多層感知機中,已經(jīng)認識了全鏈接層,缺點很明顯,在稍微大點的網(wǎng)絡模型中,參數(shù)成指數(shù)級別增長。參數(shù)量很快就達到數(shù)十億,這樣的量級幾乎無法計算。為此科學家們想出一個減少參數(shù)的方法:卷積。 從全鏈接層到卷積的推論,使用如下兩個原則: 平

    2024年02月13日
    瀏覽(59)
  • 【深度學習筆記】6_2 循環(huán)神經(jīng)網(wǎng)絡RNN(recurrent neural network)

    【深度學習筆記】6_2 循環(huán)神經(jīng)網(wǎng)絡RNN(recurrent neural network)

    注:本文為《動手學深度學習》開源內容,部分標注了個人理解,僅為個人學習記錄,無抄襲搬運意圖 上一節(jié)介紹的 n n n 元語法中,時間步 t t t 的詞 w t w_t w t ? 基于前面所有詞的條件概率只考慮了最近時間步的 n ? 1 n-1 n ? 1 個詞。如果要考慮比 t ? ( n ? 1 ) t-(n-1) t ?

    2024年03月12日
    瀏覽(22)
  • 【畢業(yè)設計】深度學習垃圾分類系統(tǒng) - python 卷積神經(jīng)網(wǎng)絡

    【畢業(yè)設計】深度學習垃圾分類系統(tǒng) - python 卷積神經(jīng)網(wǎng)絡

    ?? Hi,大家好,這里是丹成學長的畢設系列文章! ?? 對畢設有任何疑問都可以問學長哦! 這兩年開始,各個學校對畢設的要求越來越高,難度也越來越大… 畢業(yè)設計耗費時間,耗費精力,甚至有些題目即使是專業(yè)的老師或者碩士生也需要很長時間,所以一旦發(fā)現(xiàn)問題,一定

    2023年04月08日
    瀏覽(32)
  • 文本分類系統(tǒng)Python,基于深度學習CNN卷積神經(jīng)網(wǎng)絡

    文本分類系統(tǒng)Python,基于深度學習CNN卷積神經(jīng)網(wǎng)絡

    文本分類系統(tǒng),使用Python作為主要開發(fā)語言,通過TensorFlow搭建CNN卷積神經(jīng)網(wǎng)絡對十余種不同種類的文本數(shù)據(jù)集進行訓練,最后得到一個h5格式的本地模型文件,然后采用Django開發(fā)網(wǎng)頁界面,實現(xiàn)用戶在界面中輸入一段文字,識別其所屬的文本種類。 在我們的日常生活和工作中

    2024年02月08日
    瀏覽(93)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包