基于Pytorch,神经网络代码中super(Net,self).__init__()的语法深入分析

问题阐述

import torch
from torch import nn

# 搭建神经网络
class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.model = nn.Sequential(
            nn.Conv2d(3, 32, 5, 1, 2),
            nn.MaxPool2d(2),
            nn.Conv2d(32, 32, 5, 1, 2),
            nn.MaxPool2d(2),
            nn.Conv2d(32, 64, 5, 1, 2),
            nn.MaxPool2d(2),
            nn.Flatten(),
            nn.Linear(64*4*4, 64),
            nn.Linear(64, 10)
        )

    def forward(self, x):
        x = self.model(x)
        return x

在自己搭建的网络Net中,经常会见到构造器__init__()中会有super(Net, self).init()这么一句话,意思是自己搭建的网络Net会继承nn.Module:

    def __init__(self):
        super(Net, self).__init__()

可是按照之前学习的继承语法,比如B继承A,应该是如下语句:

class A:
	def __init__(self):
		pass

class B(A):
	def __init__(self):
		super().__init__()

为什么pytorch中,神经网络的搭建要这么写呢

我的理解

读完这篇文章self参数 - __ init__ ()方法 super(Net, self).init(),大概意思是:

super有个内核叫做mro,是method resolution order的缩写,作用是,mro会记录一个父类列表,告诉self实例所属的这个类在继承过程中,究竟调用哪一个父类的__init__()方法来初始化,免得父类直接相互有继承关系而造成__init__()方法交叉调用的混乱

super(type, obj)的用法:

class Son(Father, Father2):
       def __init__(self):
              super(Son, self).__init__()

mro列表=[Son, Father1, Father2, Base],super会从mro中,找到传入它的第一个参数’Son’,并第一个参数’Son’右边的一个类开始,依次寻找__init__函数。这里是从Father1开始寻找,一旦找到,就把找到的__init__函数绑定到self对象,并返回。

如果想继承中调用Father2的__init__()方法,就应该写成:

class Son(Father1, Father2):
       def __init__(self):
              super(Father1, self).__init__()

相关文章

Python super() 函数
super(Net, self).init()
super(Net,self).init() 的含义
【笔记】super(XXX,self).init( ) 的含义
解惑(一) ----- super(XXX, self).init()到底是代表什么含义
Python super() 函数(知乎)
python—方法解析顺序MRO(Method Resolution Order)<以及解决类中super方法>

  • 22
    点赞
  • 74
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值