建設部建設廳報考網站信息發(fā)布網站有哪些
文章目錄
- 一、CAM(Class Activation Mapping)
- 二、CAM技術實現(xiàn)
- 2.1 網絡修改
- 2.2 微調
- 2.2 特征提取
- 三、總結
- Reference
完整代碼見Github :https://github.com/capsule2077/CAM-Visualization ,如果有用可以點個Star,謝謝!
一、CAM(Class Activation Mapping)
CAM是類別激活映射圖,提出于論文:Learning Deep Features for Discriminative Localization ,這是一篇發(fā)表于2015年的CVPR論文。論文主要強調了卷積神經網絡具有的特征定位能力,但是堆疊的全連接層會破環(huán)這種能力。為了證明這種能力,作者通過CAM技術把這種能力可視化出來,下面的圖很直觀,這是ResNet18
對最左上角的原圖進行預測的Top5
的結果,圖的上方注明了具體的類別和對應的概率值,預測結果的圖以類似熱力圖的樣式進行標注,顏色越深的地方就是模型越關注的特征,針對不同的分類情況模型的關注點都不同。
針對概率值最大的是dome(圓頂)
,可以看到顏色最深的地方匯聚于建筑物的圓頂部分。而針對palace(宮殿)
,模型的關注點更加寬泛,深顏色區(qū)域遍布整個建筑物。由此可見,CNN確實可以捕捉到圓頂的特征和位置信息。
二、CAM技術實現(xiàn)
CAM技術其實就是全局平均池化層和一個全連接層來實現(xiàn);全局平均池化提出于論文:Network In Network,與最大池化相比,全局平均池化層可以保留更多的圖像信息,因為它計算每個池化區(qū)域的平均值,有助于捕捉整體圖像的分布信息。
全局平均池化層一般應用于網絡的末端。假設有一個三通道的特征圖,將紅色特征圖所有值算平均得到一個神經元輸出,藍綠特征圖類似。有多少個通道就能輸出一個相同維度的向量,而這個向量經過softmax就能得到分類的概率值。所以如果要用于ImageNet進行分類,在經過全局平均池化層前的特征圖是有1000個通道的,對應1000個類別。
由于GAP(Global Average Pooling 全局平均池化層)考慮一整個通道的這種特性,那么我在GAP的后面加上一個全連接層,相當于對每個通道(因為GAP得到的向量是由每個通道全局平均得來的)進行加權,其他和普通網絡一樣。
舉個例子,如果神經網絡將圖片分類成”狗“,那么把”狗“對應的全連接層權重與GAP前的特征圖進行加權計算,權重值代表了某個特征對圖像分類為”狗“的重要性。例如Resnet18最后一層特征圖有512個通道。這512個通道可以認為提取到不同的特征,該特征具有高度抽象性,且每個通道對最后的結果貢獻不同,因此單獨可視化每個通道獲取熱圖也讓人很難理解。所以CAM技術根據每個通道不同的貢獻大小去融合獲取一張CAM,類似于熱力圖可以很清晰的看出網絡聚焦的特征。
2.1 網絡修改
由于CAM技術要求網絡的最后由GAP + FC組成,但是AlexNet、VGG這些網絡都不符合,所以需要自行修改網絡結構。如何修改網絡結構參考:【Pytorch】加載預訓練模型及修改網絡結構
這里以修改VGG16為例:
def get_vgg(depth = 16):# 調用torchvision中的VGG16vgg = getattr(torchvision.models, "".join(['vgg', str(depth)]))()# 修改維全局平均池化層,即一個通道的特征圖最后只輸出一個值vgg.avgpool.output_size = (1, 1)# 修改全連接層vgg.classifier = nn.Linear(512, 100)return vgg
ResNet網絡是符合GAP + FC的結構的,所以如果用ResNet進行試驗的話可以直接調用預訓練模型。
2.2 微調
由于修改了網絡結構,所以需要對參數進行微調。微調可以只微調全連接層,其余層加載官方的預訓練權重。訓練時只需要將全連接層的參數傳入SGD優(yōu)化器即可model.classifier.parameters()
,我使用預訓練的權重在MINI-ImageNet數據集上做100分類的微調 ,MINI-ImageNet參考之前的記錄:【代碼實驗】CNN實驗——利用Imagenet子集訓練分類網絡(AlexNet/ResNet)
微調后的權重文件:VGG16_100.pth,提取碼:3v0i
...# 訓練時只需要將全連接層的參數傳入SGD優(yōu)化器即可optimizer = optim.SGD(model.classifier.parameters(), lr=args.learning_rate,momentum=0.9, weight_decay=0.0005) ...
2.2 特征提取
由于需要獲取GAP層前的特征圖,所以需要獲取模型的中間輸出,參考之前的記錄:【Pytorch】六行代碼實現(xiàn):特征圖提取與特征圖可視化
以上三點是前置知識,可以更好地理解代碼
三、總結
這里沒有對CAM技術的理論進行詳細解釋,更推薦看原論文。如果只想應用的話,完整代碼見Github :https://github.com/capsule2077/CAM-Visualization,代碼中有注釋,歡迎提出問題,如果有用可以點個Star,謝謝!
Reference
萬字長文:特征可視化技術(CAM)
神經網絡可視化——CAM及其變體