{"record":{"id":"5ddab1b5b6a3b95c","repo":"WZMIAOMIAO/deep-learning-for-image-processing","slug":"object-has-no-attribute-5ddab1","errorCode":null,"errorMessage":"'{}' object has no attribute '{}'","messagePattern":"'(.+?)' object has no attribute '(.+?)'","errorType":"exception","errorClass":"AttributeError","httpStatus":null,"severity":"error","filePath":"pytorch_segmentation/deeplab_v3/train_utils/distributed_utils.py","lineNumber":142,"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":124,"sourceCodeEnd":160,"githubUrl":"https://github.com/WZMIAOMIAO/deep-learning-for-image-processing/blob/1ec3fe6f374fc9969973a61f819de25658595afa/pytorch_segmentation/deeplab_v3/train_utils/distributed_utils.py#L124-L160","documentation":"This AttributeError is raised by the attribute delegation logic of a metric-tracking class (e.g. SmoothedValue/MetricLogger) in distributed_utils.py. The class routes attribute access first to its `meters` dict, then to instance `__dict__`, and only if both fail does it raise this error. It means you accessed a meter or attribute (e.g. `logger.loss`, `meters.global_avg`) that was never registered or set on the object.","triggerScenarios":"Accessing `logger.meters.<name>` or `<logger>.<attr>` before `update(loss=...)` was called with that key; mistyping a meter name (e.g. `train_loss` vs `loss`); accessing `global_avg`/`value`/`avg` style helpers via __getattr__ after instantiation without any update; pickling/unpickling edge cases where __dict__ is empty and __getattr__ recurses or misses.","commonSituations":"Copy-pasting training loops between projects where the metric names changed; calling `print(logger)`-style code or summary code that assumes standard meters exist; custom loops forgetting to call `metric_logger.update(...)` before reading values; running a modified train loop that logs meters not registered in `__init__` (e.g. `lr`, `grad_norm`).","solutions":["Check the exact attribute name in the message and compare against names passed to `metric_logger.update(name=value)` or `create_meters`","Ensure the meter is created/registered in the class `__init__` (e.g. `self.meters.setdefault(name, SmoothedValue())`) before first access","Call `update()` with the attribute before reading it, or use `getattr(logger, attr, default)` for optional metrics","If this fires during unpickling or init, guard against missing keys instead of relying on __getattr__ delegation"],"exampleFix":"// before\nprint(metric_logger.loss.global_avg)  # AttributeError if 'loss' never updated\n// after\nif hasattr(metric_logger, 'loss'):\n    print(metric_logger.loss.global_avg)\n# or in the loop:\nmetric_logger.update(loss=losses.item(), lr=optimizer.param_groups[0]['lr'])","handlingStrategy":"try-catch","validationCode":"attrs = set(metric_logger.meters.keys()) | set(metric_logger.__dict__.keys())\nassert 'loss' in attrs, f\"meter 'loss' not registered; have {attrs}\"","typeGuard":"def has_meter(logger, name):\n    return name in logger.meters or name in logger.__dict__","tryCatchPattern":"try:\n    avg = metric_logger.loss.global_avg\nexcept AttributeError as e:\n    logging.warning(\"missing meter: %s; available: %s\", e, list(metric_logger.meters))\n    avg = None","preventionTips":["Call update(name=value) for every metric before reading it","List logger.meters.keys() when unsure of names","Use getattr(logger, name, None) for optional metrics","Keep meter names consistent across train/eval loops"],"tags":["python","attribute-error","metrics","training-loop"],"backgroundTag":"attribute-not-found","analyzedSha":"1ec3fe6f374fc9969973a61f819de25658595afa","analyzedAt":"2026-08-30T09:19:11.901Z","schemaVersion":2},"datasetVersion":"2026-08-30T13:17:10.514Z"}