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__()中初始化的。