有关__init__的一些理解

74 阅读1分钟
class NestMLP(nn.Module):
    def __init__(self):
        super().__init__()
        self.net = nn.Sequential(nn.Linear(20,64), nn.ReLU(), 
                    nn.Linear(64,32), nn.ReLU())
        self.linear = nn.Linear(32,16)

    def forward(self,X):
        return self.linear(self.net(X))


chimera = nn.Sequential(NestMLP(),nn.Linear(16,20), FixedHiddenMLP())
chimera(X)

在初始化实例chimera时,因为会初始化NestMLP()的实例,所以会调用NestMLP()的__init__()方法。在其__init__()方法中,会先调用其父类的__init__()方法,然后初始化一个.net.linear层。在.net层中,定义了一个Sequential,在Sequential中包括四个层,在.net之外又单独定义了一个线性层。

当调用chimera时,会将输入X先传给nn.Sequential(NestMLP(),nn.Linear(16,20), FixedHiddenMLP())中的NestMLP(),这时会调用forward()方法,返回 self.linear(self.net(X)) 的值,这里边的self.net(X)和self.linear就是刚刚在__init__()中初始化的。