這篇是我對嗶哩嗶哩up主 @霹靂吧啦Wz 的視頻的文字版學習筆記 感謝他對知識的分享
1和4是之前講過的alexnet和resnet模型
2是分析中間層特征矩陣的腳本
3是查看卷積核參數的腳本
1設置預處理方法?和圖像訓練的時候用的預處理方法保持一致
2實例化模型
3載入之前的模型參數
4載入一張圖片
5對圖片進行預處理
6增加一個batch維度
7輸入模型進行正向傳播
如果print?model可以看到模型信息:
模型雖然用的是alexnet,但是關于正向傳播的代碼做了一些修改:
因為我們目的是得到中間層的特征矩陣。
希望能遍歷第一、第二、第三個卷積層并得到特征矩陣。
首先通過一個循環遍歷我們features的層結構,通過named_children這個方法遍歷features下面的所有層結構。
對于每一個層結構都用x=module(x)以實現正向傳播的過程
回到analyze_feature_map.py
squeeze一下因為我們輸入只有一個圖片所以我們不需要N這個維度
然后transpose一下通道順序
im[:,:,i]通過切片的方法獲取每一個channel的特征矩陣
cmap='gray'表示用灰度圖的方法來表示
如果不加這個,那默認就會用藍色和綠色來替代灰度圖的黑色和白色來展示
這就是我們第一個卷積層輸出的特征矩陣的前12個通道的特征圖
可以和原圖對比一下:??
卷積層2所輸出的特征矩陣:
可以看到有的通道是純黑的,也就是說有的卷積核是沒有起到任何作用的,就是沒有學到東西
卷積層越往后抽象程度越高
如果不加cmap=gray:
接下來我們看一下如何查看網絡卷積層的卷積核的信息
我們其實可以直接通過torch.load載入模型參數,返回的是一個dict字典形式,key是層名稱value就是該層的訓練信息。
state_dict()?來獲取模型中所有可訓練參數的字典keys()獲取所有具有參數的層結構的名稱
只有卷積層有訓練參數,relu和maxpool2d是沒有訓練參數的
卷積核的個數對應輸出矩陣的深度
卷積核的通道數對應輸入矩陣的深度
這一句是為了排除編程結構的一些不需要的信息
另外,如果B站視頻分辨率不太好,感覺跟全屏時的清晰度差很多,但是不全屏的話就截圖都截不清楚,那么就拖拽網頁頁面左右劃拉一下試試,就會變清晰