Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python TypeError:hook()接受3个位置参数,但给出了4个_Python_Pytorch - Fatal编程技术网

Python TypeError:hook()接受3个位置参数,但给出了4个

Python TypeError:hook()接受3个位置参数,但给出了4个,python,pytorch,Python,Pytorch,我正在尝试使用前向钩子从PyTorch中的ResNet18中间版本中提取特征 class CCLModel(nn.Module): def __init__(self,output_layer,*args): self.output_layer = output_layer super().__init__(*args) self.output_layer = output_layer #PRETRAINED MODEL

我正在尝试使用前向钩子从PyTorch中的ResNet18中间版本中提取特征

class CCLModel(nn.Module):
    def __init__(self,output_layer,*args):
        self.output_layer = output_layer
        super().__init__(*args)

        self.output_layer = output_layer
        #PRETRAINED MODEL
        self.pretrained = models.resnet18(pretrained=True)
    
        #TAKING OUTPUT FROM AN INTERMEDIATE LAYER

        #self._layers = []
        for l in list(self.pretrained._modules.keys()):
            #self._layers.append(l)
            if l == self.output_layer:
                handle = getattr(self.pretrained,l).register_forward_hook(self.hook)
   
    def hook(self,input,output):
        return output

    def _forward_impl(self, x):
        x = self.pretrained(x)
        return x

    def forward(self, x):
        return self._forward_impl(x)
我还希望预测与第4层的特征输出一起出现

但是我得到了
TypeError:hook()接受了3个位置参数,但给出了4个

完整的错误消息如下

TypeError                                 Traceback (most recent call last)
<ipython-input-66-18c4a0f917f2> in <module>()
----> 1 out = model(x.to('cuda:0').float())

6 frames
/usr/local/lib/python3.6/dist-packages/torch/nn/modules/module.py in _call_impl(self, *input, **kwargs)
    725             result = self._slow_forward(*input, **kwargs)
    726         else:
--> 727             result = self.forward(*input, **kwargs)
    728         for hook in itertools.chain(
    729                 _global_forward_hooks.values(),

<ipython-input-61-71fe0d1420a6> in forward(self, x)
     78 
     79     def forward(self, x):
---> 80         return self._forward_impl(x)
     81 
     82     '''def forward(self,x):

<ipython-input-61-71fe0d1420a6> in _forward_impl(self, x)
     73         #x = torch.flatten(x, 1)
     74         #x = self.fc(x)
---> 75         x = self.pretrained(x)
     76 
     77         return x

/usr/local/lib/python3.6/dist-packages/torch/nn/modules/module.py in _call_impl(self, *input, **kwargs)
    725             result = self._slow_forward(*input, **kwargs)
    726         else:
--> 727             result = self.forward(*input, **kwargs)
    728         for hook in itertools.chain(
    729                 _global_forward_hooks.values(),

/usr/local/lib/python3.6/dist-packages/torchvision/models/resnet.py in forward(self, x)
    218 
    219     def forward(self, x):
--> 220         return self._forward_impl(x)
    221 
    222 

/usr/local/lib/python3.6/dist-packages/torchvision/models/resnet.py in _forward_impl(self, x)
    209         x = self.layer2(x)
    210         x = self.layer3(x)
--> 211         x = self.layer4(x)
    212 
    213         x = self.avgpool(x)

/usr/local/lib/python3.6/dist-packages/torch/nn/modules/module.py in _call_impl(self, *input, **kwargs)
    729                 _global_forward_hooks.values(),
    730                 self._forward_hooks.values()):
--> 731             hook_result = hook(self, input, result)
    732             if hook_result is not None:
    733                 result = hook_result

TypeError: hook() takes 3 positional arguments but 4 were given
TypeError回溯(最近一次调用)
在()
---->1 out=model(x.to('cuda:0').float())
6帧
/usr/local/lib/python3.6/dist-packages/torch/nn/modules/module.py in_call_impl(self,*input,**kwargs)
725结果=self.\u slow\u forward(*输入,**kwargs)
726其他:
-->727结果=自转发(*输入,**kwargs)
728用于itertools.chain中的挂钩(
729 _全局_向前_hooks.values(),
前进中(自我,x)
78
79 def前进档(自身,x):
--->80返回自前向执行(x)
81
82''def前进(自身,x):
输入前向输入(self,x)
73#x=火炬。展平(x,1)
74#x=self.fc(x)
--->75 x=自预训练(x)
76
77返回x
/usr/local/lib/python3.6/dist-packages/torch/nn/modules/module.py in_call_impl(self,*input,**kwargs)
725结果=self.\u slow\u forward(*输入,**kwargs)
726其他:
-->727结果=自转发(*输入,**kwargs)
728用于itertools.chain中的挂钩(
729 _全局_向前_hooks.values(),
/前进中的usr/local/lib/python3.6/dist-packages/torchvision/models/resnet.py(self,x)
218
219 def前进档(自身,x):
-->220返回自向前执行(x)
221
222
/usr/local/lib/python3.6/dist-packages/torchvision/models/resnet.py in\u forward\u impl(self,x)
209 x=自分层2(x)
210 x=自身。第3层(x)
-->211 x=自分层4(x)
212
213 x=self.avgpool(x)
/usr/local/lib/python3.6/dist-packages/torch/nn/modules/module.py in_call_impl(self,*input,**kwargs)
729 _全局_向前_hooks.values(),
730自身.\u向前_hooks.values()):
-->731钩子结果=钩子(自身、输入、结果)
732如果hook_结果不是None:
733结果=挂钩结果
TypeError:hook()接受3个位置参数,但给出了4个

为什么钩子不起作用,尽管在各种论坛上我都看到了这样做的方法?

这里是一个简单的前钩子示例,它必须有三个参数
model
input
output

m = models.resnet18(pretrained=False)

def hook(module, input, output):
    print(output.detach().shape)

m.fc.register_forward_hook(hook)
尝试使用虚拟数据:

>>> m(torch.rand(1, 3, 224, 224))
torch.Size([1, 1000])
<<< tensor(...)
注-
self
对应于
CCLModel
实例,而
model
是我们连接的层,即
nn.Linear

下面是一个例子:

>>> m = CCLModel(nn.Linear(1000, 100))    
>>> m(torch.rand(1, 3, 224, 224))
torch.Size([1, 100])
<<< tensor(...)
>m=CCL模型(nn.线性(1000100))
>>>m(火炬兰特(1,3,224,224))
火炬尺寸([1100])
>>> m = CCLModel(nn.Linear(1000, 100))    
>>> m(torch.rand(1, 3, 224, 224))
torch.Size([1, 100])
<<< tensor(...)