super(MLP, self).__init__() 的含义

本文详细解析了PyTorch中多层感知器(MLP)类的初始化过程和前向传播方法。通过`super(MLP, self).__init__()`,子类MLP继承nn.Module并调用其初始化方法,设置网络层数、输入输出维度等参数。当层数为1时,模型简化为线性模型;否则,构建多层结构,并添加批量归一化层。在前向传播中,根据网络结构执行相应的激活和线性变换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

class MLP(nn.Module):
    def __init__(self, num_layers, input_dim, hidden_dim, output_dim):
        super(MLP, self).__init__()

 

在读论文源码时,发现如上这个比较拗口的语法点。

其实意思很简单,首先找到MLP的父类(这里是类nn.Module),然后把类MLP的对象self转换为类nn.Module的对象,然后“被转换”的类nn.Module对象调用自己的_init_函数

这是对继承自父类的属性进行初始化。而且是用父类的初始化方法来初始化继承的属性。

也就是说,子类继承了父类的所有属性和方法,父类属性自然会用父类方法来进行初始化。

当然,如果初始化的逻辑与父类的不同,不使用父类的方法,自己重新初始化也是可以的。

 

class MLP(nn.Module):
    def __init__(self, num_layers, input_dim, hidden_dim, output_dim):
         '''
            num_layers: number of layers in the neural networks (EXCLUDING the input layer). If num_layers=1, this reduces to linear model.
            input_dim: dimensionality of input features
            hidden_dim: dimensionality of hidden units at ALL layers
            output_dim: number of classes for prediction
         '''

         super(MLP, self).__init__()

         self.linear_or_not = True #default is linear model
         self.num_layers = num_layers

         if num_layers < 1:
             raise ValueError("number of layers should be positive!")
         elif num_layers == 1:
             #Linear model
             self.linear = nn.Linear(input_dim, output_dim)
         else:
             #Multi-layer model
             self.linear_or_not = False
             self.linears = torch.nn.ModuleList()
             self.batch_norms = torch.nn.ModuleList()
 
             self.linears.append(nn.Linear(input_dim, hidden_dim))
             for layer in range(num_layers - 2):
                 self.linears.append(nn.Linear(hidden_dim, hidden_dim))
             self.linears.append(nn.Linear(hidden_dim, output_dim))

             for layer in range(num_layers - 1):
                 self.batch_norms.append(nn.BatchNorm1d((hidden_dim)))

    def forward(self, x):
        if self.linear_or_not:
            #If linear model
            return self.linear(x)
        else:
            #If MLP
            h = x
            for layer in range(self.num_layers - 1):
                h = F.relu(self.batch_norms[layer](self.linears[layer](h)))
            return self.linears[self.num_layers - 1](h)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值