【Python】一个最基础,但是超难看出来的类声明为tuple的BUG

直接上代码,我在layer.py中定义了这样一个类:

class QConv2d(nn.Conv2d):
    ''' A standard Conv2d layer that quantizes input and weights before performing mult(weights, input). It quantizes outputs also. '''
    def __init__(self, inCh: int, outCh: int, kDim: int, stride: int = 1, quantization: dict = None):
        super(QConv2d,self).__init__(inCh, outCh, kDim, stride=stride, bias = False, padding = int((kDim-1)/2))

        self.isWinograd = False
        self.quantize = True if quantization['q'] else False

        if self.quantize:
            self.bits = quantization['bits']
            self.Quantize_weights = Quant(self.bits)
            self.Quantize_input = Quant(self.bits)
            self.Quantize_output = Quant(self.bits)
        else:
            self.bits = 'FP'

    def forward(self, input):
        if self.quantize:
            qinput = self.Quantize_input(input)
            qweight = self.Quantize_weights(self.weight)
            return self.Quantize_output(nn.functional.conv2d(qinput, qweight, self.bias, self.stride, self.padding, self.dilation, self.groups))
        else:
            return nn.functional.conv2d(input, self.weight, self.bias, self.stride, self.padding, self.dilation, self.groups)

然后我在model.py中对其进行声明:

self.conv1 = QConv2d(in_planes, planes, kDim=3, stride=stride, quantization=Q_args),

结果,出现了这样的报错:

TypeError: 'tuple' object is not callable

打印self.conv1可以看到:

<class 'tuple'>
(QConv2d(
  16, 32, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False
  (Quantize_weights): Quant()
  (Quantize_input): Quant()
  (Quantize_output): Quant()
),)

为啥这个class是个tuple类型呀!?

原因非常简单,我在声明类的时候, 末尾多了一个逗号!!!!!! 修改后如下:

self.conv1 = QConv2d(in_planes, planes, kDim=3, stride=stride, quantization=Q_args)

再打印self.conv1看看:

<class 'src.layers.Conv2d'>
QConv2d(                                                                                                                                                                                                                                                             
  32, 64, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False
  (Quantize_weights): Quant()
  (Quantize_input): Quant()
  (Quantize_output): Quant()
)

小结一句,Python末尾是没有分号或者逗号的,要防止误敲无关字符!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Mr.zwX

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

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

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

打赏作者

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

抵扣说明:

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

余额充值