开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第11天
本文首发于CSDN。
运行环境,报错信息和查找到的错误内容: Linux系统 Python 3.8(使用anaconda管理的虚拟环境) PyTorch 1.11+cudatoolkit 10.2(通过anaconda下载)
本问题出自使用PyTorch运行深度学习代码的情况下。
一般来说,是在定义Module时,没有在__init__()中提前使用super()代码正确继承父类的__init__()函数,导致出现标题所说的问题:AttributeError: cannot assign module before Module.__init__() call
这个错误信息的字面意思就是说,必须要先继承__init__()函数,才能进行后续的代码工作。
这个问题是出现在自定义PyTorch模型(torch.nn.Module)子类的运行过程中,在__init__()函数中报错。
我的错误原因是super(类名,self).__init__()忘写最后一个括号了。将括号加上后,就能正常运行了。
这个错误的原因就在于还没有调用Module.__init__()就开始定义子模型了,如self.classifier=nn.Linear(input_dim,output_dim)等。参考异常解决(二)-- AttributeError: cannot assign module before Module.__init__() call_奋斗の博客的博客-CSDN博客,也可能是因为直接没写super()命令而造成的。加上之后就可以正常运行。
super()函数是用于继承父类方法的。PyTorch模型类必须要先继承__init__()方法,之后才能进行后续的代码编写工作(如定义模型层、定义模型中的各项操作等)。否则就会报如标题所示的错误。
PyTorch模型(torch.nn.Module)中__init__()和forward()函数一般都是必须要存在的。前者是为了初始化模型层,在前者中配置到self上的模型层都会自动注册(register),也就是可以实现梯度下降等操作;后者是为了实现模型操作。