第一种:
参考链接:(35条消息) Pytorch中hook如何直接调取网络中间层的输入输出数据(不理论分析,直接实践上手教程)_pytroch网络输入数据_one努力翻身的咸鱼的博客-CSDN博客对于
input_data = {}
output_data = {}
def get_activation(name):
def hook(model,input,output):
input_data[name] = input[0].detach() # input type is tulple, only has one element, which is the tensor
output_data[name] = output.detach() # output type is tensor
return hook
————————————————
版权声明:本文为CSDN博主「one努力翻身的咸鱼」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/JasonFuyz/article/details/126803862
对于这样的形式在我实际用的时候虽然很方便的从字典里看得出哪一层的输出,但是在代码验证的时候会出现以下错误。AttributeError: Can‘t pickle local object
对于这样的错误我也在网上查看了是因为闭包的原因。所以这样的方法我也就用不了了。(因为我我i不会改,不知道怎么解除闭包)
但是也有可能是另外一种原因就是没有remove hook(不过我没有尝试)。
第二种:
参考链接:(36条消息) Pytorch获取中间层信息-hook函数_pytorch提取中间层特征 hook_winycg的博客-CSDN博客
features = []
def hook(module, input, output):
features.append(output.clone().detach())
handle.remove()
用完之后remove就好。我忘记remove了,还是会报错AttributeError: Can‘t pickle local object 。
个人使用经验注意事项:
hook在网络推理之前注册,remove在网络推理之后。