mmdetection中Swin transformer检测器的代码注解

首先说一下之前有小伙伴问的两个问题:

为什么每次定义网络都需要写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__() 方法,就可以使得类的实例对象变为可调用对象。对于可调用对象ÿ

猜你喜欢

转载自blog.csdn.net/qq_42308217/article/details/123470974