Module nodes
info
ExCore defines some module nodes for parsing toml file in excore's way.
caution
In fact, those nodes is called LazyCall in detectron2. Although the whole system is designed for toml file, but they still can be used in pure python configurations.
For instance:
from excore.config.models import ModuleNode
from xxx import Module
cfg = ModuleNode(Module) << dict(arg1=1, arg2=2)
# or
cfg = ModuleNode(Module).add(arg1=1, arg2=2)
model = cfg() # support instantiate recursively
# or
model = ModuleNode(Module)(arg1=1, arg2=2)
ModuleNode
ModuleNode is the base class of all module nodes. It's derived from python built-in class dict. The arguments will be directly stored in the instance of ModuleNode and you can manipulate the node like dict.
InterNode
InterNode is ModuleNode:
class InterNode(ModuleNode):
pass
ReusedNode
ReusedNode will cache the outputs of __call__ method.
ClassNode
ClassNode will return the class instead of its instance.
GetAttr
Wrap the chained invocation of a node, for example:
If we want to implement ResNet().blocks.conv(), we can use GetAttr
from excore.config.models import ModuleNode, GetAttr
from xxx import ResNet
GetAttr.from_list(ModuleNode(ResNet), ["blocks", "conv()"])