WZMIAOMIAO/deep-learning-for-image-processing · error · AttributeError
'{}' object has no attribute '{}'
Error message
'{}' object has no attribute '{}' What it means
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.
Source
Thrown at pytorch_segmentation/deeplab_v3/train_utils/distributed_utils.py:142
class MetricLogger(object):
def __init__(self, delimiter="\t"):
self.meters = defaultdict(SmoothedValue)
self.delimiter = delimiter
def update(self, **kwargs):
for k, v in kwargs.items():
if isinstance(v, torch.Tensor):
v = v.item()
assert isinstance(v, (float, int))
self.meters[k].update(v)
def __getattr__(self, attr):
if attr in self.meters:
return self.meters[attr]
if attr in self.__dict__:
return self.__dict__[attr]
raise AttributeError("'{}' object has no attribute '{}'".format(
type(self).__name__, attr))
def __str__(self):
loss_str = []
for name, meter in self.meters.items():
loss_str.append(
"{}: {}".format(name, str(meter))
)
return self.delimiter.join(loss_str)
def synchronize_between_processes(self):
for meter in self.meters.values():
meter.synchronize_between_processes()
def add_meter(self, name, meter):
self.meters[name] = meter
def log_every(self, iterable, print_freq, header=None):View on GitHub (pinned to 1ec3fe6f37)
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
Example fix
// before
print(metric_logger.loss.global_avg) # AttributeError if 'loss' never updated
// after
if hasattr(metric_logger, 'loss'):
print(metric_logger.loss.global_avg)
# or in the loop:
metric_logger.update(loss=losses.item(), lr=optimizer.param_groups[0]['lr']) Defensive patterns
Strategy: try-catch
Validate before calling
attrs = set(metric_logger.meters.keys()) | set(metric_logger.__dict__.keys())
assert 'loss' in attrs, f"meter 'loss' not registered; have {attrs}" Type guard
def has_meter(logger, name):
return name in logger.meters or name in logger.__dict__ Try / catch
try:
avg = metric_logger.loss.global_avg
except AttributeError as e:
logging.warning("missing meter: %s; available: %s", e, list(metric_logger.meters))
avg = None Prevention
- 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
When it happens
Trigger: 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.
Common situations: 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`).
Related errors
- '{}' object has no attribute '{}'
- '{}' object has no attribute '{}'
- '{}' object has no attribute '{}'
- '{}' object has no attribute '{}'
- '{}' object has no attribute '{}'
AI-assisted analysis of WZMIAOMIAO/deep-learning-for-image-processing@1ec3fe6f37 (2026-08-30).
Data as JSON: /api/errors/5ddab1b5b6a3b95c.
Report an issue: GitHub.