nn.transformer中的注意力权重提取,torch网络中间层提取

文章展示了如何在PyTorch的nn.transformer模块中,通过修改need_weights参数为True来获取注意力权重,并利用forward_hook函数提取TransformerEncoderLayer中多头注意力层的中间输出。示例代码解释了如何注册hook到特定层以观察输入和输出特征。
摘要由CSDN通过智能技术生成

nn.transformer源码中
原状:
在这里插入图片描述将need_weights改为True,这样multiheadattention才可以输出注意力权重。
在这里插入图片描述然后使用hook提取中间层输出,示例代码如下:

import torch
import torch.nn as nn

num_heads = 4
input_dim = 16
model = nn.TransformerEncoder(nn.TransformerEncoderLayer(input_dim, num_heads),6)
print(model)

query = torch.randn(10, 8, input_dim)

features_in_hook = []
features_out_hook = []

def hook(module, fea_in, fea_out):
    features_in_hook.append(fea_in)     #去掉这行就不会留下输入了
    features_out_hook.append(fea_out)
    return None

# for (name, module) in model.named_modules():      #看看各层的名字
#     print(name)

# layer_name = 'layers.5.self_attn'
# for (name, module) in model.named_modules():
#     if name == layer_name:
#         module.register_forward_hook(hook=hook)
        
model.layers[-1].self_attn.register_forward_hook(hook) #这样也可以代替上面四行,如果很多层,用上面的

c = model(query)

features_in_hook和features_out_hook为指定层的输入和输出
参考1
参考2

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

feiGeorge

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值