rbgirshick / yacs

YACS -- Yet Another Configuration System
Apache License 2.0
1.27k stars 90 forks source link

how to merge two config? #29

Open unsky opened 5 years ago

unsky commented 5 years ago

config1.py:

from yacs.config import CfgNode as CN
_C = CN()
_C.SYSTEM = CN()
# Number of GPUS to use in the experiment
_C.SYSTEM.NUM_GPUS = 8
# Number of workers for doing things
_C.SYSTEM.NUM_WORKERS = 4

config2.py:

from yacs.config import CfgNode as CN
_C = CN()
_C.TRAIN = CN()
# A very important hyperparameter
_C.TRAIN.HYPERPARAMETER_1 = 0.1
# The all important scales for the stuff
_C.TRAIN.SCALES = (2, 4, 8, 16)

how meger two config?

lancejchen commented 5 years ago

package yacs is actually a dict wrapper. So first you read the first config as usual, let's say as Variable CONFIG, then you read the second config as a new python dict (e.g. variable a), then update the CONFIG variable using items in "a". The following function can be used:

def deep_update(source, overrides):
    for key, value in overrides.iteritems():
        if isinstance(value, collections.Mapping) and value:
            returned = deep_update(source.get(key, {}), value)
            returned = CfgNode(returned)
            source[key] = returned
        else:
            source[key] = overrides[key]
    return source
RizhaoCai commented 3 years ago

_C = CN(new_allowed=True)

It works for me.

harrygcoppock commented 1 year ago

You can use the 'merge_from_other_cfg' method:

https://github.com/rbgirshick/yacs/blob/32d5e4ac300eca6cd3b839097dde39c4017a1070/yacs/config.py#L215 e.g.


config1 = CN()
config1.BLAH = blah

config2 = CN()
config2.FOO = bar

config1.set_new_allowed(TRUE) # recursively update set_new_allowed to allow merging of configs and subconfigs
config1.merge_from_other_cfg(config2)```