fangwei123456 / spikingjelly

SpikingJelly is an open-source deep learning framework for Spiking Neural Network (SNN) based on PyTorch.
https://spikingjelly.readthedocs.io
Other
1.24k stars 235 forks source link

Cannot call pre-trained models in spikingjelly.clock_driven.model #482

Closed WangQingchen123 closed 6 months ago

WangQingchen123 commented 6 months ago

When I use spikingjelly.clock_driven.model.sew_resnet.multi_step_sew_resnet101, I got error TypeError: 'NoneType' object is not callable And models like spiking_resnet and spiking_vgg have the same problem when called. The exact location of the reported error: `class MultiStepSEWResNet(nn.Module): def init(self, block, layers, num_classes=1000, zero_init_residual=False, groups=1, width_per_group=64, replace_stride_with_dilation=None, norm_layer=None, T:int=None, cnf: str=None, multi_step_neuron: callable = None, **kwargs): super().init() self.T = T if norm_layer is None: norm_layer = nn.BatchNorm2d self._norm_layer = norm_layer

    self.inplanes = 64
    self.dilation = 1
    if replace_stride_with_dilation is None:
        # each element in the tuple indicates if we should replace
        # the 2x2 stride with a dilated convolution instead
        replace_stride_with_dilation = [False, False, False]
    if len(replace_stride_with_dilation) != 3:
        raise ValueError("replace_stride_with_dilation should be None "
                         "or a 3-element tuple, got {}".format(replace_stride_with_dilation))
    self.groups = groups
    self.base_width = width_per_group
    self.conv1 = nn.Conv2d(3, self.inplanes, kernel_size=7, stride=2, padding=3,
                           bias=False)
    self.bn1 = norm_layer(self.inplanes)
    self.sn1 = multi_step_neuron(**kwargs)
    self.maxpool = nn.MaxPool2d(kernel_size=3, stride=2, padding=1)
    self.layer1 = self._make_layer(block, 64, layers[0], cnf=cnf, multi_step_neuron=multi_step_neuron, **kwargs)
    self.layer2 = self._make_layer(block, 128, layers[1], stride=2,
                                   dilate=replace_stride_with_dilation[0], cnf=cnf, multi_step_neuron=multi_step_neuron,
                                   **kwargs)
    self.layer3 = self._make_layer(block, 256, layers[2], stride=2,
                                   dilate=replace_stride_with_dilation[1], cnf=cnf, multi_step_neuron=multi_step_neuron,
                                   **kwargs)
    self.layer4 = self._make_layer(block, 512, layers[3], stride=2,
                                   dilate=replace_stride_with_dilation[2], cnf=cnf, multi_step_neuron=multi_step_neuron,
                                   **kwargs)
    self.avgpool = nn.AdaptiveAvgPool2d((1, 1))
    self.fc = nn.Linear(512 * block.expansion, num_classes)

    for m in self.modules():
        if isinstance(m, nn.Conv2d):
            nn.init.kaiming_normal_(m.weight, mode='fan_out', nonlinearity='relu')
        elif isinstance(m, (nn.BatchNorm2d, nn.GroupNorm)):
            nn.init.constant_(m.weight, 1)
            nn.init.constant_(m.bias, 0)

    # Zero-initialize the last BN in each residual branch,
    # so that the residual branch starts with zeros, and each residual block behaves like an identity.
    # This improves the model by 0.2~0.3% according to https://arxiv.org/abs/1706.02677
    if zero_init_residual:
        for m in self.modules():
            if isinstance(m, Bottleneck):
                nn.init.constant_(m.bn3.weight, 0)
            elif isinstance(m, BasicBlock):
                nn.init.constant_(m.bn2.weight, 0)`

在初始化时,self.sn1 = multi_step_neuron(**kwargs)在这句报错了。

fangwei123456 commented 6 months ago

multi_step_neuron设置成IFNode试试

WangQingchen123 commented 6 months ago

multi_step_neuron设置成IFNode试试

非常感谢你的帮助!这个问题解决了! 但是还有一个问题让我很困惑 `model = multi_step_spiking_resnet101(pretrained=True).eval() img = read_image('../pictures/cat.jpg')

input_tensor = normalize(resize(img, (224, 224)) / 255., [0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) input_tensor = input_tensor.unsqueeze(0).repeat(4,1,1,1,1) input_tensor.requiresgrad() out = model(input_tensor)`

在调用model计算时,报错cannot register a hook on a tensor that doesn't require gradient

fangwei123456 commented 6 months ago

eval模式下有的神经元会屏蔽梯度计算

WangQingchen123 commented 6 months ago

解决了,非常感谢!