python 可视化解释模型
创始人
2024-01-25 12:54:05
0

1. 自定义DataSet

MakeDataset.py
首先准备好一个数据集文件,这里以mydata文件夹存放图片数据, 实现自定义DataSet

class MyDataset(Dataset):def __init__(self,resize):super(MyDataset,self).__init__()self.resize = resizedef __len__(self):return len(images)def __getitem__(self,idx):img = images[idx]tf = transforms.Compose([lambda x:Image.open(x).convert('RGB'),transforms.Resize((self.resize,self.resize)),transforms.ToTensor(),transforms.Normalize(mean = [0.485,0.456,0.406],std = [0.229,0.224,0.225])		])img_tensor = tf(image)# `mydata\\ICH\\1470718-1.JPG`label_tensor = torch.tensor(class_name_index[image.split(os.sep)[-2]])return img_tensor,label_tensor

2 模型定义及训练

2.1 模型

这里以一个玩具模型作为演示,模型的定义如下:
MyModle.py

class MyResNet(nn.Module):def __init__(self):super(MyResNet,self).__init__()general_features = 32# Initial convolution blockself.conv0 = nn.Conv2d(3,general_features,3,1,padding=1)self.conv1 = nn.Conv2d(general_features,general_features,3,1,padding =1)self.relu1 = nn.ReLU()self.conv2 = nn.Conv2d(general_features,general_features,3,1,padding=1)self.relu2 = nn.ReLU()# Down sample 1/2self.downsample0 = nn.Maxpool2d(2,2)self.downsample1 = nn.Maxpool2d(2,2)self.downsample2 = nn.Maxpool2d(2,2)self.downsample3 = nn.Maxpool2d(2,2)self.fc0 = nn.Linear(32*8*8, 2)def forward(self,x):x = self.conv0(x)			#[1,32,128,128]x = self.downsample0(x)		#[1,32,64,64]x = self.downsample1(x)		#[1,32,32,32]x = self.relu1(self.conv1(x)) #[1,32,32,32]x = self.downsample2(x)		  # [1,32,16,16]x = self.relu2(self.conv2(x)) #[1,32,16,16]x = self.downsample3(x)		  # [1,32,8,8]x = x.view(x.shape[0],-1)     # Flattenx = x.softmax(self.fc0(x),dim=1)return x# x = torch.randn(1,3,128,128)
# m = myResNet()
# summary(m,(3,128,128))
# print(m(x).shape)	

2.2 训练

训练train.py获得权重文件

import torch
from torch import optim,nn
from torch.utils.data import Dataloader
from MakeDataSet import MyDatasetfrom MyModel import MyResNettrain_db = MyDataset(resize = 128)
train_loader = DataLoader(train_db,batch_size=4,shuffle=True)
print('num_train:',len(train_loader.dataset))model = MyResNet()optimizer = optim.Adam(model.parameters(),lr =0.001)
criteon = nn.CrossEntropyLoss()epochs = 5for epoch in range(epochs):for step,(x,y) in enumerate(train_loader):model.train()logits = model(x)loss = criteon(logits,y)optimizer.zero_grad()loss.backward()optimizer.step()print('Epochs:',epoch,'Loss:',loss)torch.save(model.state_dict(),'weights_MyResNet.mdl')
print('Save Done')

3 利用SmoothGradCAMpp对特征图可视化

Visualize_featrue_map, 这里介绍smooth gradcampp用法

import torch
from torchvision import transforms
from torchvision.transforms.functional import to_pil_image
from torchcam.methods import SmoothGradCAMpp,CAM,GradCAM,GradCAMpp,XGradCAM,ScoreCAM
from torchcam.utils import overlay_mask
from MyModel import MyResNet
from PIL import image
import matplotlib.pyplot import plttf = transforms.Compose([lambda x:Image.open(x).convert('RGB')transforms.Resize(128,128)transforms.ToTensor(),transforms.Normalize(mean = [0.485,0.456,0.406],std = [0.229,0.224,0.225])
])img_ICH_test = tf('ICH_test.jpg').unsqueeze(dim=0)
#print(img_ICH_test.shape)img_Normal_test = tf('Normal_test.jpg').unsqueeze(dim=0)model = MyResNet()
model.load_state_dict(torch.load('weights_MyResNet.mdl'))
print('loaded from ckpt')
model.eval()cam_extractor = SmoothGradCAMpp(model,input_shape=(3,128,128))
# cam_extractor = GradCAMpp(model,input_shape=(3,128,128))
# cam_extractor = XGradCAM(model,input_shape=(3,128,128))
# cam_extractor = ScoreCAM(model,input_shape=(3,128,128))
# cam_extractor = SSCAM(model,input_shape=(3,128,128))
# cam_extractor =ISCAM(model,input_shape=(3,128,128))
# cam_extractor = LayerCAM(model,input_shape=(3,128,128))
  • 载入测试图片Normal_test.jpg
    在这里插入图片描述
  • 加载预训练权重,实例化模型
output = model(img_Normal_test)
print(output)activation_map = cam_extractor(output.sequeeze(0).argmax().item(),output)
print(activation_map[0],activation_map[0].min(),activation_map[0].max(),activation_map[0].shape)#fused_map = cam_extractor.fuse_cams(activation_map)
#print(fused_map[0],fused_map[0].min(),fused_map[0].max(),fused_map[0].shape)result = overlay_mask(to_pil_image(img_Normal_test[0]),to_pil_image(activation_map[0],mode='F'),alpha=0.3)
plt.imshow(result)
plt.show()
  • 将模型的输出预测类别索引送入到构建的cam_extractor对象中,由于activation_map输出的是一个tuple,通过索引0取值
  • 接着用overlay_mask进行可视化效果展示,传入原图和激活map,并利用alpha参数设置一定的透明度
  • 由于输出的result是PIL格式,所以可以直接用imshow显示
    在这里插入图片描述
    最热的区域就是模型主要依据这部分来判断类别,这里没有指定可视化feature map的哪一层的话,就默认是全连接测上一层feature map

这个包的主页在: https://pypi.org/project/torchcam/,感兴趣的可以看看

相关内容

热门资讯

高考结束后祝福语 高考结束后祝福语15篇  在平凡的学习、工作、生活中,大家都写过祝福语吧,祝福语有助于人与人之间感情...
有感于幸福的晚安美图 有感于幸福的晚安美图  有些话我们止于唇舌,  因为心事不是对谁都能说;  有些时我们假装快乐,  ...
祝母亲节快乐的祝福语微信 2020年祝母亲节快乐的祝福语微信汇总44条  这个属于妈妈的节日,我摘下云朵,剪下霞光,想念缝合,...
唯美中秋节祝福语 关于唯美中秋节祝福语(精选40句)  将来,无论我成为参天大树,还是低矮的灌木,我都将以生命的翠绿向...
教师节祝福语 教师节祝福语(精选350句)  在学习、工作或生活中,大家都尝试过写祝福语吧,祝福语可以起到可以增进...
出国深造祝福语 出国深造祝福语  在平平淡淡的学习、工作、生活中,大家都尝试过写祝福语吧,祝福语能给亲朋好带去好运和...
元旦新年微信祝福语24条 精选元旦新年微信祝福语24条  将离别的骊歌唱响,把前进的赞歌悠扬。昨天已把烦恼清光,今天且把快乐带...
祝七夕快乐的祝福语 2020年祝七夕快乐的祝福语大集合49条  爱是缘分,爱是感动,爱是习惯,爱是宽容,爱是牺牲,爱是体...
乔迁之喜的经典祝福语 乔迁之喜的经典祝福语(精选100句)  无论在学习、工作或是生活中,说到祝福语,大家肯定都不陌生吧,...
祝自己生日祝福语 有关祝自己生日祝福语(精选75句)  无论是身处学校还是步入社会,大家对祝福语都不陌生吧,祝福语是人...
暖心除夕祝福语短信 2021年暖心除夕祝福语短信32句  除夕到了,没什么礼物可送。就送你一副快乐的春联,贴上后粘住所有...
冬至温暖人心的简单祝福语 冬至温暖人心的简单祝福语  在平日的学习、工作和生活里,大家总少不了要接触或使用祝福语吧,祝福语可以...
温馨元宵节祝福语短信 温馨元宵节祝福语短信合集54句  元宵佳节吃元宵,各种馅料都尝到。品品黑芝麻,好运连连年年发;尝尝红...
中国对联 中国对联大全  江山故国堪留鹤 华夏昊天可跃龙  龙腾华夏钟灵地 德启门庭毓秀人  唯大英雄能伏虎 ...
学生感恩教师节祝福语 学生感恩教师节祝福语  在平平淡淡的学习、工作、生活中,要用到祝福语的地方还是很多的,祝福语可以起到...
情人节祝福语图 2017情人节祝福语大全图  常相思,长相思,相思时节谁人知;梦难忆,爱难忆,愁肠百结谁人识;缘难了...
妈妈生日贺卡祝福语 妈妈生日贺卡祝福语(精选60句)  在我们平凡的日常里,大家对祝福语都不陌生吧,祝福语的种类很多,可...
公司适用国庆祝福语 公司适用国庆祝福语  在平平淡淡的日常中,大家或多或少都会用到过祝福语吧,祝福语能给亲朋好带去好运和...
温馨情人节祝福语 精选温馨情人节祝福语大集合45句  [xx]年前的今天,泰坦尼克号沉没,唯有爱情永恒。黑色情人节,天...