Python 为什么PyTorch定制模块中需要超级构造函数?
为什么在下面的代码中需要调用Python 为什么PyTorch定制模块中需要超级构造函数?,python,inheritance,pytorch,super,Python,Inheritance,Pytorch,Super,为什么在下面的代码中需要调用super(LR,self)。\uuuu init\uuuu()?我得到错误“AttributeError:无法在模块之前分配模块。init()调用”否则。该错误是由self.linear=nn.linear(输入大小、输出大小)引起的 我不明白调用super(LR,self)。\uuu init\uuu()和能够将nn.Linear对象分配给self.Linear之间有什么联系。nn.Linear是一个单独的对象,可以分配给任何类之外的变量,那么为什么需要调用sup
super(LR,self)。\uuuu init\uuuu()
?我得到错误“AttributeError:无法在模块之前分配模块。init()调用”否则。该错误是由self.linear=nn.linear(输入大小、输出大小)
引起的
我不明白调用super(LR,self)。\uuu init\uuu()
和能够将nn.Linear对象分配给self.Linear之间有什么联系。nn.Linear是一个单独的对象,可以分配给任何类之外的变量,那么为什么需要调用super(LR,self)。\uuu init\uuu()
将线性对象分配给类内的self.Linear
class LR(nn.Module):
# Constructor
def __init__(self, input_size, output_size):
# Inherit from parent
super(LR, self).__init__()
self.test = 1
self.linear = nn.Linear(input_size, output_size)
# Prediction function
def forward(self, x):
out = self.linear(x)
return out
您需要super()调用,以便初始化mn.Module类本身。在Python中,不会自动调用超类构造函数/初始化器-必须显式调用它们,而super()就是这样做的-它会确定要调用的超类
我假设您使用的是Python 3—在这种情况下,您不需要super()调用中的参数—这就足够了:
super().__init__()
在自定义类中编写
self.linear=nn.linear(…)
时,实际上是在调用类的\uuuu setattr\uuuu
函数。恰好当您扩展nn.Module
时,您的类继承了很多东西,其中之一就是。正如您在实现中所看到的(我只发布下面的相关部分),如果nn.Linear
是nn.Module
的实例,则您的类必须具有名为\u modules
的属性,否则它将抛出您得到的AttributeError
:
def\uuu setattr\uuuu(self,name:str,value:Union[Tensor,'Module'])->无:
# [...]
模块=自.uuu dict.get(“u模块”)
如果isinstance(值、模块):
如果模块为无:
raise AttributeError(“无法在module.\uuu init\uuu()调用之前分配模块”)
从(self.\u dict\u,self.\u参数,self.\u缓冲区,self.\u非持久性\u缓冲区集)中删除
模块[名称]=值
如果您查看nn.Module
,您将看到self.\u modules
在那里初始化:
def\uuuu初始化(自):
"""
初始化内部模块状态,由nn.Module和ScriptModule共享。
"""
torch.\u C.\u log\u api\u用法\u一次(“python.nn\u模块”)
自我训练=真实
self.\u参数=OrderedDict()
self.\u buffers=OrderedDict()
self.\u非\u持久性\u缓冲区\u集=集()
self.\u backward\u hooks=OrderedDict()
self.\u forward\u hooks=OrderedDict()
self.\u forward\u pre\u hooks=OrderedDict()
self.\u state\u dict\u hooks=OrderedDict()
self.\u load\u state\u dict\u pre\u hooks=OrderedDict()
self._modules=OrderedDict()#是的。我深入调查了来源并找到了答案。谢谢你抽出时间来回答。@ CMODY7.77开源是最好的:如果你认为这回答了你的问题并且可能对其他人有帮助,考虑把它投票或标记为答案。