提取CNN模型中间层输出方法

本文介绍了如何在结构中定义了多个nn.Sequential的深度学习模型下,获取内部中间层输出的两种策略。方法一是通过逐层前向执行,自定义函数跳过非操作层并定位目标层;方法二是利用hook函数,注册保存输出的hook,并在预测过程中自动捕获目标层的输出。这两种方法都需要精确识别目标层的索引,以便正确提取所需信息。
摘要由CSDN通过智能技术生成

前言

针对结构中定义了多个nn.sequential的网络模型,无法直接获取其内部某一中间层的输出,本文将给出两个方法进行解决。
在这里插入图片描述
在这里插入图片描述

方法

1 逐层进行forward

创建自定义函数,实现按照执行顺序逐层前向执行网络模型。
-----将模型输入以及模型作为参数传入函数,返回目标结果

def extract_res(inp, model):
    for index, module in enumerate(model.modules()):  # 按执行顺序遍历网络各层操作
        if index in [0, 1, ...]:  # 去除非操作层
            continue
        inp = module(inp)  # 逐层前向执行,得到结果
        if index == 3:  # 判断是否为目标层  (示例为索引为3的操作)
            return inp

tip: 利用.modules()在进行遍历操作时,其顺序为:
【总网络结构–>各部分–>各部分内部】

在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述
==》可见index = 0,1对应为非操作层,需要避免其执行forward。
故在使用此方法时,需要注意摒弃非操作层,跳过执行。此外,须推理出目标输出层对应索引号,才能实现精准获取。


2 使用hook函数

(1)定义保存hook内容的对象类

class SaveOutput:
    def __init__(self):
        self.outputs = []

    def __call__(self, module, module_in, module_out):
        self.outputs.append(module_out)

    def clear(self):
        self.outputs = []

(2) 为卷积层注册hook

	hook_handles = []
	save_output = SaveOutput()
	for layer in model.modules():     # 按执行顺序遍历网络各层操作
	if isinstance(layer, nn.Linear):   # 按操作指令进行判别
	        handle = layer.register_forward_hook(save_output)
	        hook_handles.append(handle)

代码中示例即为寻找所有为执行nn.Linear()的操作层

(3) 对输入x进行预测(过程中每计算一个输出将自动调用hook函数)

out = model(x)  

(4)取出通过目标层的输出

data = save_output.outputs[2]    # 2为目标操作层输出在最终结果列表中的索引

tip: 网络包含几个操作同名层save_output.outputs的size就为多少,取出对应位置的输出即可

------tbc-------
有用可以点个大拇指哦 🤭

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

8倍

谢谢大佬~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值