pytorch特征可视化——特征图

一、核心函数

第一行的参数是必须的,第二行的参数是save_image这个函数调用make_grid时用的,make_grid的作用是将多通道的特征拼接成一个网格状排列的大图,make_grid返回的是一个tensor,save_image直接将图片保存在filename路径。

# tensor 的shape要变成[C, 1, H, W]
torchvision.utils.save_image(tensor, filename,
		nrow=8, padding=2, normalize=False, range=None, scale_each=False, pad_value=0)

简单的例子

a = torch.randn((1, 32, 256, 512))
file_path = 'result/a.png'
a = a.permute(1, 0, 2, 3)
torchvision.utils.save_image(a, file_path)

二、优雅的使用方式

上述的简单例子可以适用于任意情况,只要写在模型的forward()函数内即可,如果不想写在forward()内,则可以用另外的方式实现,结合torch.nn.Module.register_forward_hook函数。

1. torch.nn.Module.register_forward_hook

函数声明:register_forward_pre_hook(hook: Callable[..., None])
括号中的参数是一个函数名,姑且称之为hook_func,hook_func需要自己实现。

hook_func可从前向过程中接收到三个参数:hook_func(module, input, output)。其中module指的是模块的名称,调用register_forward_hook后会自己绑定,比如对于卷积层,module是Conv2d,注意module带有具体的参数。input和output就是我们所需的特征图,这二者分别是module的输入和输出,输入可能有多个(比如concate层就有多个输入),输出只有一个,所以input是一个tuple,其中每一个元素都是一个tensor,而输出就是一个tensor。一般而言output可能更经常拿来做分析。我们可以在hook_func中将特征图画出来并保存为图片,所以hook_func是实现可视化的关键。

2. 具体使用方法

# 定义全局字典存储features
features = {}

def get_activation(name):
    """
    :param name: 特征名字
    :return: 
    """
    def hook_func(module, input, output):
        """
        :param module: 调用register_forward_hook后自动绑定
        :param input: 输入
        :param output: 输出
        :return: 
        """
        # 这里可以写自己所需要的处理方式
        features[name] = output.detach()
    return hook_func

# 可视化features
def show_features(features):
    """
    :param features: 特征字典 
    :return: 
    """
    for keys, values in features.items():
        # 将特征的shape变成[C, 1, H, W]
        values = values.permute(1, 0, 2, 3)
        # 保存路径
        image_name = 'result/' + keys + '.png'
        torchvision.utils.save_image(values, image_name)

if __name__ == '__main__':
	# 创建模型
	model = nn.DataParallel(.......)

	# 为模型的某一层或者某一模块注册hook
	model.module.my_block_or_layer.register_forward_hook(get_activation('my_block_or_layer'))
	
	# 调用模型前向传播
	.................

	# 保存特征图
	show_features(features)

特征图可视化结果

### PyTorch 中模型特征可视化的方法 #### 使用 `pytorchviz` 进行计算图可视化 为了更好地理解神经网络的工作原理,可以利用 `pytorchviz` 创建PyTorch执行图和轨迹的可视化。这有助于直观了解数据流经各个层的情况以及各部分之间的连接关系[^1]。 ```python import torch from torch.autograd import Variable from pytorchviz import make_dot # 定义简单的线性回归模型并构建输入张量 model = torch.nn.Linear(2, 2) x = Variable(torch.randn(1, 2)) # 绘制计算图 dot = make_dot(model(x), params=dict(list(model.named_parameters()))) dot.render('linear_model.gv', format='png') ``` #### 利用 TensorBoard 实现特征图和其他指标监控 除了上述方法外,还可以借助于TensorFlow团队开发的强大工具——TensorBoard来完成更加丰富的可视化任务。通过集成到训练循环中的几行代码就可以记录下每次迭代后的权重变化情况、损失函数曲线甚至整个网络架构本身[^3]。 ```python from torch.utils.tensorboard import SummaryWriter writer = SummaryWriter() for n_iter in range(100): writer.add_scalar('Loss/train', scalar_value=loss.item(), global_step=n_iter) # 将模型结构写入日志文件夹以便后续查看 dummy_input = torch.rand(1, 3, 224, 224).to(device) with SummaryWriter(comment='ResNet') as w: w.add_graph(net, dummy_input) ``` #### 展示特定层输出的特征映射图像 对于某些应用场景来说可能还需要观察卷积核提取出来的局部模式或者激活响应分布状况,在这种情况下可以直接获取指定位置处的数据再转换成灰度级形式显示出来[^4]。 ```python def plot_feature_maps(layer_output): plt.figure(figsize=(8, 8)) # 假设layer_output形状为[N,C,H,W],这里只取第一个样本的所有通道 num_channels = layer_output.shape[1] for i in range(num_channels): ax = plt.subplot(int(np.sqrt(num_channels)), int(np.ceil(float(num_channels)/np.sqrt(num_channels))), i+1) img = layer_output[0,i,:,:].cpu().data.numpy() ax.imshow(img, cmap='gray') plt.show() intermediate_outputs = model.layer_of_interest(input_tensor) plot_feature_maps(intermediate_outputs) ```
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值