<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
文章中的程式碼是參考基於Pytorch的特徵圖提取編寫的程式碼本身很簡單這裡只做簡單的描述。
先看效果圖(第一張是原圖,後面的都是相應的特徵圖,這裡使用的網路是resnet50,需要注意的是下面圖片顯示的特徵圖是經過放大後的圖,原圖是比較小的圖,因為太小不利於我們觀察):
import os import torch import torchvision as tv import torchvision.transforms as transforms import torch.nn as nn import torch.optim as optim import argparse import skimage.data import skimage.io import skimage.transform import numpy as np import matplotlib.pyplot as plt import torchvision.models as models from PIL import Image import cv2 class FeatureExtractor(nn.Module): def __init__(self, submodule, extracted_layers): super(FeatureExtractor, self).__init__() self.submodule = submodule self.extracted_layers = extracted_layers def forward(self, x): outputs = {} for name, module in self.submodule._modules.items(): if "fc" in name: x = x.view(x.size(0), -1) x = module(x) print(name) if self.extracted_layers is None or name in self.extracted_layers and 'fc' not in name: outputs[name] = x return outputs def get_picture(pic_name, transform): img = skimage.io.imread(pic_name) img = skimage.transform.resize(img, (256, 256)) img = np.asarray(img, dtype=np.float32) return transform(img) def make_dirs(path): if os.path.exists(path) is False: os.makedirs(path) def get_feature(): pic_dir = './images/2.jpg' transform = transforms.ToTensor() img = get_picture(pic_dir, transform) device = torch.device("cuda" if torch.cuda.is_available() else "cpu") # 插入維度 img = img.unsqueeze(0) img = img.to(device) net = models.resnet101().to(device) net.load_state_dict(torch.load('./model/resnet101-5d3b4d8f.pt')) exact_list = None dst = './feautures' therd_size = 256 myexactor = FeatureExtractor(net, exact_list) outs = myexactor(img) for k, v in outs.items(): features = v[0] iter_range = features.shape[0] for i in range(iter_range): #plt.imshow(x[0].data.numpy()[0,i,:,:],cmap='jet') if 'fc' in k: continue feature = features.data.numpy() feature_img = feature[i,:,:] feature_img = np.asarray(feature_img * 255, dtype=np.uint8) dst_path = os.path.join(dst, k) make_dirs(dst_path) feature_img = cv2.applyColorMap(feature_img, cv2.COLORMAP_JET) if feature_img.shape[0] < therd_size: tmp_file = os.path.join(dst_path, str(i) + '_' + str(therd_size) + '.png') tmp_img = feature_img.copy() tmp_img = cv2.resize(tmp_img, (therd_size,therd_size), interpolation = cv2.INTER_NEAREST) cv2.imwrite(tmp_file, tmp_img) dst_file = os.path.join(dst_path, str(i) + '.png') cv2.imwrite(dst_file, feature_img) if __name__ == '__main__': get_feature()
下面的模組是根據所指定的模型篩選出指定層的特徵圖輸出,如果未指定也就是extracted_layers是None則以字典的形式輸出全部的特徵圖,另外因為全連線層本身是一維的沒必要輸出因此進行了過濾。
class FeatureExtractor(nn.Module): def __init__(self, submodule, extracted_layers): super(FeatureExtractor, self).__init__() self.submodule = submodule self.extracted_layers = extracted_layers def forward(self, x): outputs = {} for name, module in self.submodule._modules.items(): if "fc" in name: x = x.view(x.size(0), -1) x = module(x) print(name) if self.extracted_layers is None or name in self.extracted_layers and 'fc' not in name: outputs[name] = x return outputs
這段主要是儲存圖片,為每個層建立一個資料夾將特徵圖以JET的colormap進行按順序儲存到該資料夾,並且如果特徵圖過小也會對特徵圖放大同時儲存原始圖和放大後的圖。
for k, v in outs.items(): features = v[0] iter_range = features.shape[0] for i in range(iter_range): #plt.imshow(x[0].data.numpy()[0,i,:,:],cmap='jet') if 'fc' in k: continue feature = features.data.numpy() feature_img = feature[i,:,:] feature_img = np.asarray(feature_img * 255, dtype=np.uint8) dst_path = os.path.join(dst, k) make_dirs(dst_path) feature_img = cv2.applyColorMap(feature_img, cv2.COLORMAP_JET) if feature_img.shape[0] < therd_size: tmp_file = os.path.join(dst_path, str(i) + '_' + str(therd_size) + '.png') tmp_img = feature_img.copy() tmp_img = cv2.resize(tmp_img, (therd_size,therd_size), interpolation = cv2.INTER_NEAREST) cv2.imwrite(tmp_file, tmp_img) dst_file = os.path.join(dst_path, str(i) + '.png') cv2.imwrite(dst_file, feature_img)
這裡主要是一些引數,比如要提取的網路,網路的權重,要提取的層,指定的影象放大的大小,儲存路徑等等。
net = models.resnet101().to(device) net.load_state_dict(torch.load('./model/resnet101-5d3b4d8f.pt')) exact_list = None#['conv1'] dst = './feautures' therd_size = 256
上面的辦法只是簡單的將經過網路計算的圖片的輸出的feature進行圖片,github上有將CNN的梯度等全部進行視覺化的程式碼:pytorch-cnn-visualizations,需要注意的是如果只是簡單的替換成自己的網路可能無法執行,大概率會報model沒有features或者classifier等錯誤,這兩個是進行分類網路定義時的Sequential,其實就是索引網路的每一層,自己稍微修改用model.children()
等方法進行替換即可,我自己修改之後得到的程式碼grayondream-pytorch-visualization(本來想稍微封裝一下成為一個更加通用的結構,暫時沒時間以後再說吧!),下面是效果圖:
到此這篇關於使用pytorch提取折積神經網路的特徵圖視覺化的文章就介紹到這了,更多相關pytorch提取特徵圖視覺化內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45