根据网络结构块对应的代码块
from yacs.config import CfgNode as CN
很多模型需要设置超参数,当超参数过多时,不方便管理,于是出现了很多类似yaml,yacs的包。YACS是一个轻量级库,用于定义和管理系统配置,例如那些在为科学实验设计的软件中常见的配置。要在项目中使用YACS,首先要创建一个项目配置文件,通常称为config.py或defaults.py。
import os
from yacs.config import CfgNode as CN
# -----------------------------------------------------------------------------
# Config definition
# -----------------------------------------------------------------------------
#创建一个配置节点 _C
_C = CN()
#在_C下创建新的配置节点_C.MODEL
#给_C.MODEL的属性配置默认值
_C.MODEL = CN()
_C.MODEL.RPN_ONLY = False
_C.MODEL.MASK_ON = False
register_fn
是一个装饰器函数例如
@registry.BACKBONES.register("ViL-C4")
def build_vilc4_backbone(cfg):
assert len(cfg.MODEL.TRANSFORMER.OUT_FEATURES) == 1, "The number of OUT_FEATURES in ViL-C4 is not 1!"
body = build_msvit_backbone(cfg)
model = nn.Sequential(OrderedDict([("body", body)]))
model.out_channels = body.out_planes
return model
def __init__(self, *args, **kwargs):
super(Registry, self).__init__(*args, **kwargs)
def register(self, module_name, module=None):
# used as function call
if module is not None:
_register_generic(self, module_name, module)
return
# used as decorator
def register_fn(fn):
_register_generic(self, module_name, fn)
return fn
return register_fn
这里当你在一个函数前使用 @registry.register("module_name")
这种装饰器语法时,Python 实际上会将这个函数替换为 register_fn
函数。然后,当你调用被装饰的函数时,实际上是在调用 register_fn
,(因为最后返回register_fn
函数),它将 fn
注册到注册表并返回原始的 fn
,以便你可以继续使用它。
这里举例的装饰器ViL-C4,这个语法是 Python 提供的一种简便方式,用来告诉 Python 解释器将 build_vilc4_backbone函数传递给 register_fn
函数并将其返回的函数与 build_vilc4_backbone 绑定。
举例可以看出