首先说一下之前有小伙伴问的两个问题:
为什么每次定义网络都需要写forward()函数,而它又不是python的特殊函数?
答:因为我们的网络父类都为nn.Module类(mmdetection最新版本都为BaseModule类),而nn.Module类中定义了__call__()方法,该方法中调用了forward()函数。因此当执行module(data)的时候,会自动调用__call__()函数。
class Module(nn.Module):
def __init__(self):
super(Module, self).__init__()
# ......
def forward(self, x):
# ......
return x
data = ..... #输入数据
module = Module()# 实例化一个对象
module(data) # 前向传播
"""
而不是使用module.forward(data)
而实际上 module(data) 和 module.forward(data) 是等价的
"""
注:Python 中,凡是可以将 () 直接应用到自身并执行,都称为可调用对象。 如果在类中实现 __call__() 方法,就可以使得类的实例对象变为可调用对象。对于可调用对象ÿ