python打卡day46@浙大疏锦行

知识点回顾:

  1. 不同CNN层的特征图:不同通道的特征图
  2. 什么是注意力:注意力家族,类似于动物园,都是不同的模块,好不好试了才知道。
  3. 通道注意力:模型的定义和插入的位置
  4. 通道注意力后的特征图和热力图

内容参考

作业:

  1. 今日代码较多,理解逻辑即可
  2. 对比不同卷积层特征图可视化的结果(可选)

一、CNN特征图可视化实现

复制代码
import torch
import matplotlib.pyplot as plt

def visualize_feature_maps(model, input_tensor):
    # 注册钩子获取中间层输出
    features = []
    def hook(module, input, output):
        features.append(output.detach().cpu())
    
    # 选择不同卷积层观察
    target_layers = [
        model.layer1[0].conv1,
        model.layer2[0].conv1,
        model.layer3[0].conv1
    ]
    
    handles = []
    for layer in target_layers:
        handles.append(layer.register_forward_hook(hook))
    
    # 前向传播
    with torch.no_grad():
        _ = model(input_tensor.unsqueeze(0))
    
    # 移除钩子
    for handle in handles:
        handle.remove()
    
    # 可视化不同层特征图
    fig, axes = plt.subplots(len(target_layers), 5, figsize=(20, 10))
    for i, feat in enumerate(features):
        for j in range(5):  # 显示前5个通道
            axes[i,j].imshow(feat[0, j].numpy(), cmap='viridis')
            axes[i,j].axis('off')
    plt.show()

二、通道注意力模块示例

复制代码
class ChannelAttention(nn.Module):
    def __init__(self, in_channels, reduction=16):
        super().__init__()
        self.avg_pool = nn.AdaptiveAvgPool2d(1)
        self.max_pool = nn.AdaptiveMaxPool2d(1)
        
        self.fc = nn.Sequential(
            nn.Linear(in_channels, in_channels // reduction),
            nn.ReLU(),
            nn.Linear(in_channels // reduction, in_channels),
            nn.Sigmoid()
        )
    
    def forward(self, x):
        # ... existing code ...
        return x * attention_weights  # 应用注意力权重

三、热力图生成方法

复制代码
def generate_heatmap(model, input_img):
    # 前向传播获取梯度
    model.eval()
    input_img.requires_grad = True
    output = model(input_img)
    pred_class = output.argmax(dim=1).item()
    
    # 反向传播计算梯度
    model.zero_grad()
    output[0, pred_class].backward()
    
    # 获取最后一个卷积层的梯度
    gradients = model.layer4[1].conv2.weight.grad
    pooled_gradients = torch.mean(gradients, dim=[0,2,3])
    
    # 生成热力图
    activations = model.layer4[1].conv2.activations.detach()
    for i in range(activations.shape[1]):
        activations[:,i,:,:] *= pooled_gradients[i]
    heatmap = torch.mean(activations, dim=1).squeeze()
    
    return heatmap
相关推荐
Aleeeeex1 小时前
RAG 那点事:从 8 份企业文档到能用的问答系统,全过程拆给你看
人工智能·python·ai编程
2301_809204701 小时前
mysql在docker容器中如何部署_利用docker-compose快速启动
jvm·数据库·python
Legendary_0082 小时前
LDR6500:USB‑C DRP PD协议芯片技术详解与应用实践
c语言·开发语言
2301_800976932 小时前
正则表达式
开发语言·python·正则表达式
故事还在继续吗2 小时前
C++20关键特性
开发语言·c++·c++20
码界奇点2 小时前
基于Python的新浪微博数据爬虫系统设计与实现
数据库·爬虫·python·毕业设计·新浪微博·源代码管理
AI木马人3 小时前
1.人工智能实战:大模型推理接口响应慢?从模型加载到 FastAPI 部署的完整优化方案
人工智能·python·fastapi
青少儿编程课堂3 小时前
2026青少儿信息素养大赛备赛指南!Python/Scratch/C++备考要点
开发语言·c++·python
用户8356290780513 小时前
使用 Python 设置 Excel 数据验证
后端·python