yacs icon indicating copy to clipboard operation
yacs copied to clipboard

how to merge two config?

Open unsky opened this issue 5 years ago • 3 comments

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?

unsky avatar Aug 22 '19 08:08 unsky

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

lancejchen avatar Aug 22 '19 08:08 lancejchen

_C = CN(new_allowed=True)

It works for me.

RizhaoCai avatar Dec 19 '20 08:12 RizhaoCai

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)```

harrygcoppock avatar Jan 04 '23 14:01 harrygcoppock