Pytorch 如何在torchvision的《盗梦空间》V3中将挂钩连接到ReLUs

Pytorch 如何在torchvision的《盗梦空间》V3中将挂钩连接到ReLUs,pytorch,torchvision,Pytorch,Torchvision,我正在使用。我试图在模型中找到ReLUs: def recursively_find_submodules(model, submodule_type): module_list = [] q = [model] while q: child = q.pop() if isinstance(child, submodule_type): module_list.append(child) q.

我正在使用。我试图在模型中找到ReLUs:

def recursively_find_submodules(model, submodule_type):
    module_list = []
    q = [model]    
    while q:
        child = q.pop()
        if isinstance(child, submodule_type):
            module_list.append(child)
        q.extend(list(child.children()))                 
    return module_list

inception = torch.hub.load('pytorch/vision:v0.6.0', 'inception_v3', pretrained=True)
l = recursively_find_submodules(inception, torch.nn.ReLU) # l is empty!
因此,RELU不是torch模型中任何模块的子模块。经过仔细检查,我在torchvision的源代码中发现了ReLUs,但不是作为模块。在
inception.py
中,我发现了以下内容:

class BasicConv2d(nn.Module):

    def __init__(self, in_channels, out_channels, **kwargs):
        super(BasicConv2d, self).__init__()
        self.conv = nn.Conv2d(in_channels, out_channels, bias=False, **kwargs)
        self.bn = nn.BatchNorm2d(out_channels, eps=0.001)

    def forward(self, x):
        x = self.conv(x)
        x = self.bn(x)
        return F.relu(x, inplace=True)

因此,
BasicConv2d
模块使用ReLU函数钳制其输出,而不是模块(
torch.nn.ReLU
)。我想在不修改整个模型以使用ReLU模块的情况下,没有办法连接到ReLU函数并修改其输入/输出,或者有办法做到这一点吗?

您可以连接到ReLU前面的批次规范层并附加到那里,考虑到您观察到的是ReLU的输入,而不是激活后的功能

考虑到您观察到的是ReLU的输入,而不是激活后的功能,您可以连接到ReLU之前的批次规范层并附加到该层