做网站需要知道什么软件,计算机软件开发是干什么的,海曙区做网站,新闻类wordpress模板使用特征图输出进行特征图可视化 文章目录 前言效果展示获取某一层特征图输出原图方法一#xff1a;使用IntermediateLayerGetter类方法二#xff1a;使用hook机制#xff08;推荐#xff09; 总结 前言
提示#xff1a;这里可以添加本文要记录的大概内容#xff1a;
例… 使用特征图输出进行特征图可视化 文章目录 前言效果展示获取某一层特征图输出原图方法一使用IntermediateLayerGetter类方法二使用hook机制推荐 总结 前言
提示这里可以添加本文要记录的大概内容
例如随着人工智能的不断发展机器学习这门技术也越来越重要很多人都开启了学习机器学习本文就介绍了基于pytorch使用特征图输出进行特征图可视化的方法
特征图输出就是某个图像序列经过该层时的输出 以下是本篇文章正文内容
效果展示 获取某一层特征图输出
原图 方法一使用IntermediateLayerGetter类
# 返回输出结果
import randomimport cv2
import torchvision
import torch
from matplotlib import pyplot as plt
import numpy as np
from torchvision import transforms
from torchvision import models# 定义函数随机从0-end的一个序列中抽取size个不同的数
def random_num(size, end):range_ls [i for i in range(end)]num_ls []for i in range(size):num random.choice(range_ls)range_ls.remove(num)num_ls.append(num)return num_lspath img_1.png
transformss transforms.Compose([transforms.ToTensor(),transforms.Resize((224, 224)),transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])])# 注意如果有中文路径需要先解码最好不要用中文
img cv2.imread(path)
img cv2.cvtColor(img, cv2.COLOR_BGR2RGB)# 转换维度
img transformss(img).unsqueeze(0)model models.resnet50(pretrainedTrue)
new_model torchvision.models._utils.IntermediateLayerGetter(model, {layer1: 1, layer2: 2, layer3: 3})
out new_model(img)tensor_ls [(k, v) for k, v in out.items()]# 这里选取layer2的输出画特征图
v tensor_ls[1][1]# 选择目标卷积层
target_layer model.layer2[2]如果要选layer3的输出特征图只需把第一个索引值改为2即
vtensor_ls[2][1]
只需把第一个索引更换为需要输出的特征层对应的位置索引即可# 取消Tensor的梯度并转成三维tensor否则无法绘图
v v.data.squeeze(0)print(v.shape) # torch.Size([512, 28, 28])# 随机选取25个通道的特征图
channel_num random_num(25, v.shape[0])
plt.figure(figsize(10, 10))
for index, channel in enumerate(channel_num):ax plt.subplot(5, 5, index 1, )plt.imshow(v[channel, :, :])
plt.savefig(./img/feature.jpg, dpi300)
输出的结果如下
方法二使用hook机制推荐
如下代码所示:
# 返回输出结果
import randomimport cv2
import torchvision
import torch
from matplotlib import pyplot as plt
import numpy as np
from torchvision import transforms
from torchvision import models# 定义函数随机从0-end的一个序列中抽取size个不同的数
def random_num(size, end):range_ls [i for i in range(end)]num_ls []for i in range(size):num random.choice(range_ls)range_ls.remove(num)num_ls.append(num)return num_lspath img_1.png
transformss transforms.Compose([transforms.ToTensor(),transforms.Resize((224, 224)),transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])])# 注意如果有中文路径需要先解码最好不要用中文
img cv2.imread(path)
img cv2.cvtColor(img, cv2.COLOR_BGR2RGB)# 转换维度
img transformss(img).unsqueeze(0)model models.resnet50(pretrainedTrue)# 选择目标层
target_layer model.layer2[2]
# 注册钩子函数用于获取目标卷积层的输出
outputs []
def hook(module, input, output):outputs.append(output)hook_handle target_layer.register_forward_hook(hook)_ model(img)v outputs[-1]
如果要选layer3的输出特征图只需把第一个索引值改为2即
vtensor_ls[2][1]
只需把第一个索引更换为需要输出的特征层对应的位置索引即可# 取消Tensor的梯度并转成三维tensor否则无法绘图
v v.data.squeeze(0)print(v.shape) # torch.Size([512, 28, 28])# 随机选取25个通道的特征图
channel_num random_num(25, v.shape[0])
plt.figure(figsize(10, 10))
for index, channel in enumerate(channel_num):ax plt.subplot(5, 5, index 1, )plt.imshow(v[channel, :, :])
plt.savefig(./img/feature2.jpg, dpi300)
总结
以上就是今天要讲的内容