{"record":{"id":"860999e6135d0060","repo":"WZMIAOMIAO/deep-learning-for-image-processing","slug":"object-has-no-attribute-860999","errorCode":null,"errorMessage":"'{}' object has no attribute '{}'","messagePattern":"'(.+?)' object has no attribute '(.+?)'","errorType":"exception","errorClass":"AttributeError","httpStatus":null,"severity":"error","filePath":"pytorch_segmentation/fcn/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/fcn/train_utils/distributed_utils.py#L124-L160","documentation":"Identical family to error 150 but in the FCN project's distributed_utils.py: a MetricLogger/SmoothedValue container raises AttributeError when an accessed attribute is neither a registered meter nor in instance __dict__. The __getattr__ fallback is the last resort before failing, so the requested metric simply does not exist.","triggerScenarios":"Reading `metric_logger.<name>` for a key never passed to `update()`; mistyped meter name; accessing meters after `reset()` cleared them; code assuming FCN train loop registers meters that only the detection loop registers (e.g. 'mask_loss').","commonSituations":"Adapting the FCN train_one_epoch to log extra metrics without creating them; summary/print code copied from another project; running evaluation loop expecting train-only meters.","solutions":["Compare the missing attribute name with keys passed to `metric_logger.update(...)` in train_one_epoch/evaluate","Register the meter at logger creation (`self.meters[name] = SmoothedValue(...)`) or ensure update() is called before access","Use `hasattr`/`getattr(..., None)` for optional metrics","Check for typos and copy-paste drift between project variants"],"exampleFix":"// before\nprint(metric_logger.lr.global_avg)  # AttributeError: never registered\n// after\nmetric_logger.update(lr=optimizer.param_groups[0]['lr'])\nprint(metric_logger.lr.global_avg)","handlingStrategy":"try-catch","validationCode":"registered = set(metric_logger.meters) | set(metric_logger.__dict__)\nassert 'loss' in registered, f\"'loss' missing; registered: {registered}\"","typeGuard":"def meter_exists(logger, name):\n    return name in getattr(logger, 'meters', {}) or name in logger.__dict__","tryCatchPattern":"try:\n    value = getattr(metric_logger, name).global_avg\nexcept AttributeError as e:\n    logging.warning(\"meter %s missing: %s\", name, e)\n    value = float('nan')","preventionTips":["Register all meters before the training loop starts","Update meters with the same keys every iteration","Grep for metric_logger.update to enumerate valid names","Avoid copy-pasting meter names between project variants"],"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"}