问题阐述

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方法>

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐