问题阐述
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方法>
|