{"record":{"id":"3916ed1e2f8d48e5","repo":"WZMIAOMIAO/deep-learning-for-image-processing","slug":"object-has-no-attribute-3916ed","errorCode":null,"errorMessage":"'{}' object has no attribute '{}'","messagePattern":"'(.+?)' object has no attribute '(.+?)'","errorType":"exception","errorClass":"AttributeError","httpStatus":null,"severity":"error","filePath":"pytorch_segmentation/u2net/train_utils/distributed_utils.py","lineNumber":209,"sourceCode":"\nclass MetricLogger(object):\n    def __init__(self, delimiter=\"\\t\"):\n        self.meters = defaultdict(SmoothedValue)\n        self.delimiter = delimiter\n\n    def update(self, **kwargs):\n        for k, v in kwargs.items():\n            if isinstance(v, torch.Tensor):\n                v = v.item()\n            assert isinstance(v, (float, int))\n            self.meters[k].update(v)\n\n    def __getattr__(self, attr):\n        if attr in self.meters:\n            return self.meters[attr]\n        if attr in self.__dict__:\n            return self.__dict__[attr]\n        raise AttributeError(\"'{}' object has no attribute '{}'\".format(\n            type(self).__name__, attr))\n\n    def __str__(self):\n        loss_str = []\n        for name, meter in self.meters.items():\n            loss_str.append(\n                \"{}: {}\".format(name, str(meter))\n            )\n        return self.delimiter.join(loss_str)\n\n    def synchronize_between_processes(self):\n        for meter in self.meters.values():\n            meter.synchronize_between_processes()\n\n    def add_meter(self, name, meter):\n        self.meters[name] = meter\n\n    def log_every(self, iterable, print_freq, header=None):","sourceCodeStart":191,"sourceCodeEnd":227,"githubUrl":"https://github.com/WZMIAOMIAO/deep-learning-for-image-processing/blob/1ec3fe6f374fc9969973a61f819de25658595afa/pytorch_segmentation/u2net/train_utils/distributed_utils.py#L191-L227","documentation":"Same MetricLogger.__getattr__ AttributeError as the lraspp variant: the u2net training utility's SmoothedValue/MetricLogger raises AttributeError when an attribute is neither in self.meters nor self.__dict__. It exists so that missing attribute access fails loudly instead of returning None.","triggerScenarios":"Reading a meter attribute (e.g. metric_logger.lr) before it was ever assigned, or misspelling a meter name in the validation/training loop of u2net training.","commonSituations":"Typos like metric_logger.metres, accessing a metric before update() was called, refactoring meter names between train and eval phases.","solutions":["Correct the attribute/meter name","Initialize the meter before first read, e.g. metric_logger.lr = SmoothedValue()","Guard with hasattr() or `name in metric_logger.meters`"],"exampleFix":"// before\nlr = metric_logger.learnig_rate.global_avg\n// after\nlr = metric_logger.lr.global_avg","handlingStrategy":"validation","validationCode":"missing = [n for n in ['loss', 'lr'] if n not in metric_logger.meters]\nif missing:\n    raise KeyError(f\"meters not registered: {missing}\")","typeGuard":"def has_attr(logger, name: str) -> bool:\n    return name in getattr(logger, 'meters', {}) or hasattr(logger, name)","tryCatchPattern":"try:\n    stats = {k: v.global_avg for k, v in metric_logger.meters.items()}\nexcept AttributeError as e:\n    print(f\"metric access failed: {e}\"); stats = {}","preventionTips":["Assign SmoothedValue meters before the first update/read","Copy meter names verbatim between training and validation code","Grep for `metric_logger.` usages when renaming meters"],"tags":["python","attributeerror","training-loop"],"backgroundTag":"attribute-not-found","analyzedSha":"1ec3fe6f374fc9969973a61f819de25658595afa","analyzedAt":"2026-08-30T09:19:11.901Z","schemaVersion":2},"datasetVersion":"2026-08-30T13:17:10.514Z"}