hook来获取模型每层的激活值输出

1.利用train_dataset来提取数据集,并且提取第一个数据集图像,没有batch维度

2.添加 batch 维度: [C, H, W] -> [1, C, H, W]img = img.unsqueeze(0)

import sys

import os

from pathlib import Path

解决 OpenMP 库冲突问题

os.environ['KMP_DUPLICATE_LIB_OK'] = 'TRUE'

添加项目根目录到 Python 路径

project_root = Path(file).parent.parent

sys.path.insert(0, str(project_root))

from utils.hanfeng_dataset import HanfengDataset

import torch

import torch.nn as nn

import matplotlib.pyplot as plt

import torchvision

from models.UNeXt.UNeXt_Stripe_Conv import UNext_Stripe_Conv

========== 1. 准备一个存储激活值的字典 ==========

activations = {}

data_root = r"D:\github\DSNet-main\data\hanfeng"

def get_activation(name):

"""定义hook函数"""

def hook(model, input, output):

activations[name] = output.detach()

return hook

========== 2. 给模型的层注册hook ==========

model = UNext_Stripe_Conv(num_classes=1)

model.eval()

给所有卷积层注册hook

for name, layer in model.named_modules():

if isinstance(layer, nn.Conv2d):

layer.register_forward_hook(get_activation(name))

========== 3. 前向传播,自动捕获激活值 ==========

定义数据预处理 transform

import albumentations as A

from albumentations.pytorch import ToTensorV2

transform = A.Compose([

A.Resize(224, 224), # 调整大小,避免显存溢出

A.Normalize(mean=[0.105, 0.105, 0.105], std=[0.203, 0.203, 0.203]), # ImageNet 标准化

ToTensorV2(), # 转换为 tensor,自动变成 [C, H, W]

])

train_dataset = HanfengDataset(data_root, mode='trainval', transform=transform, auto_fix_path=True)

print(f"✓ 训练集加载成功: {len(train_dataset)} 个样本")

img, mask, meta = train_dataset[0]

print(f"图像形状: {img.shape}") # 现在应该是 [C, H, W]

# 添加 batch 维度: [C, H, W] -> [1, C, H, W]

img = img.unsqueeze(0)

with torch.no_grad():

output = model(img)

========== 4. 可视化任意层 ==========

def visualize_layer(layer_name, num_channels=16):

"""显示某层的前num_channels个通道"""

act = activations[layer_name][0] # [C, H, W]

fig, axes = plt.subplots(4, 4, figsize=(10, 10))

for i, ax in enumerate(axes.flat):

if i < min(num_channels, act.shape[0]):

ax.imshow(act[i].cpu(), cmap='viridis')

ax.set_title(f'Ch {i}')

ax.axis('off')

plt.suptitle(f'{layer_name}')

plt.show()

使用

print(f"捕获了 {len(activations)} 层")

first_conv = list(activations.keys())[0]

visualize_layer(first_conv)

相关推荐
Coding茶水间20 小时前
基于深度学习的驾驶行为检测系统演示与介绍(YOLOv12/v11/v8/v5模型+Pyqt5界面+训练代码+数据集)
深度学习·qt·yolo
执笔论英雄20 小时前
【RL】中Token级策略梯度损失
人工智能·pytorch·深度学习
栈与堆20 小时前
LeetCode-88-合并两个有序数组
java·开发语言·数据结构·python·算法·leetcode·rust
万俟淋曦20 小时前
【论文速递】2025年第52周(Dec-21-27)(Robotics/Embodied AI/LLM)
人工智能·深度学习·机器学习·机器人·大模型·论文·具身智能
超人小子20 小时前
自动化报表系统实战:用Python让报表工作智能化
运维·python·自动化
dagouaofei20 小时前
AI 生成 2026 年工作计划 PPT,内容质量差异在哪里
人工智能·python·powerpoint
ai_top_trends20 小时前
2026 年工作计划汇报 PPT:AI 生成方案实测对比
人工智能·python·powerpoint
创作者mateo20 小时前
PyTorch 入门学习笔记(实战篇)二
pytorch·笔记·学习
寻星探路20 小时前
【Python 全栈测开之路】Python 基础语法精讲(三):函数、容器类型与文件处理
java·开发语言·c++·人工智能·python·ai·c#
且去填词20 小时前
构建基于 DeepEval 的 LLM 自动化评估流水线
运维·人工智能·python·自动化·llm·deepseek·deepeval