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
相关推荐
镜子AI2 分钟前
教培机构多模态内容跨模态检索系统:基于CLIP的统一表征与图文混合召回算法
人工智能·python·算法·机器学习
落魄大学生之流水线上谋生计4 分钟前
Selenium 入门到实战:用 Python 写出稳定的浏览器自动化
python·selenium·自动化
阡陌数智7 分钟前
RAG 系统的召回退化:向量库、分块、重排全链路问题排查与优化实践
开发语言·人工智能·语言模型·自然语言处理·推荐算法
汤米粥12 分钟前
后端开发主流技术方案
java·python·golang·php·nodejs·后端开发
geovindu15 分钟前
rust: Flyweight Pattern
开发语言·后端·设计模式·rust·享元模式·结构型模式
我的xiaodoujiao15 分钟前
Django 基础知识详细图文教程 13-Django 模型定义与使用 3
数据库·后端·python·测试工具·oracle·django
小静AI工程实验室20 分钟前
robots.txt 不是门禁:RFC 9309 规则、缓存与 Python 爬虫的 10 个边界
爬虫·python·缓存
沉下心来学鲁班25 分钟前
DeepAgents 记忆机制:让 AI Agent 拥有“跨对话“的记忆
服务器·人工智能·python
Helix25028 分钟前
Python与其他编程语言优劣势对比:2026初学者选型指南
java·python·教程·编程语言·入门·初学者编程选型