pytorch使用hook获得特征图

本文介绍了如何通过定义forward和backward hook函数来捕获卷积神经网络(LeNet)中的特征图和梯度信息。通过在conv2层注册forward_hook,输入随机张量并执行前向传播,可以得到不同层的特征图大小和形状。这种方法对于网络可视化和理解深度学习模型内部工作原理非常有用。
摘要由CSDN通过智能技术生成

更细节的建议参考使用hook获得特征图可视化

定义如下两个hook函数,简单几步就能获得特征图了


fmap_block = dict()  # 装feature map
grad_block = dict()  # 装梯度

def backward_hook(module, grad_in, grad_out):
    grad_block['grad_in'] = grad_in
    grad_block['grad_out'] = grad_out


def farward_hook(module, inp, outp):
    fmap_block['input'] = inp
    fmap_block['output'] = outp
import torch
from torch import nn

#定义网路
class LeNet(nn.Module):  
    def __init__(self):
        super(LeNet, self).__init__()
        self.conv1 = nn.Conv2d(3,6,3,1,1)
        self.relu1 = nn.ReLU()
        self.pool1 = nn.MaxPool2d(2,2)
        self.conv2 = nn.Conv2d(6,9,3,1,1)
        self.relu2 = nn.ReLU()
        self.pool2 = nn.MaxPool2d(2,2)
        self.fc1 = nn.Linear(8*8*9, 120)
        self.relu3 = nn.ReLU()
        self.fc2 = nn.Linear(120,10)

    def forward(self, x):
        out = self.pool1(self.relu1(self.conv1(x)))
        out = self.pool2(self.relu2(self.conv2(out)))
        out = out.view(out.shape[0], -1)
        out = self.relu3(self.fc1(out))
        out = self.fc2(out)

        return out

#实例化网络
net = LeNet()


# 注册hook
net.conv2.register_forward_hook(farward_hook)

定义输入

input_img = torch.randn(1,3,32,32).requires_grad_()  
fmap_block = dict()  # 装feature map
outs = net(input_img)

print(len(fmap_block))
print(fmap_block["output"].shape)
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个使用PyTorchhook机制来获取EfficientDate模型卷积层特征的示例代码: ```python import torch from efficientnet_pytorch import EfficientNet # 加载EfficientDate模型 model = EfficientNet.from_pretrained('efficientnet-b0', num_classes=10) # 定义一个列表,用于存储指定层的输出 outputs = [] # 定义hook函数,用于获取指定层的输出 def hook(module, input, output): # 将输出保存到列表中 outputs.append(output) # 注册hook函数到指定层 target_layer = model._blocks[9]._depthwise_conv hook_handle = target_layer.register_forward_hook(hook) # 输入像进行前向传播 inputs = torch.randn(1, 3, 224, 224) outputs = model(inputs) # 获取指定层的输出作为特征 feature_map = outputs[0] # 将特征保存为片 import matplotlib.pyplot as plt plt.imshow(feature_map.detach().numpy()[0, 0, :, :], cmap='gray') plt.show() # 移除hook函数 hook_handle.remove() ``` 在上述代码中,我们首先加载了EfficientDate模型,然后定义了一个列表`outputs`,用于存储hook函数获取的指定层的输出。接着,我们定义了一个hook函数`hook`,用于将指定层的输出保存到`outputs`列表中。然后,我们通过`register_forward_hook`方法将`hook`函数注册到EfficientDate模型的第9个block的深度卷积层上,以获取该层的输出。接下来,我们输入像进行前向传播,模型会自动调用hook函数,将指定层的输出保存到`outputs`列表中。然后我们将特征绘制成灰度并显示。最后,我们从`outputs`列表中获取指定层的输出作为特征,并移除hook函数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值