WZMIAOMIAO/deep-learning-for-image-processing · error · AttributeError
'{}' object has no attribute '{}'
Error message
'{}' object has no attribute '{}' What it means
SmoothedValue meter container implements __getattr__ that raises AttributeError when the requested attribute is neither in self.meters nor self.__dict__. Python's default attribute resolution failure surfaces through this custom path, so accessing a misspelled or never-logged metric name raises this error.
Source
Thrown at pytorch_object_detection/retinaNet/train_utils/distributed_utils.py:161
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
- Print type(self).meters keys to see registered metric names and fix the typo
- Ensure the metric was added before access: metric_logger.meters['name'] = SmoothedValue()
- Use getattr(metric, name, default) when metric presence is optional
Example fix
// before print(metric_logger.lerning_rate) # typo // after print(metric_logger.learning_rate)
Defensive patterns
Strategy: try-catch
Validate before calling
available = list(metric_logger.meters.keys())
assert metric_name in available, f'{metric_name} not logged; have {available}' Type guard
def has_metric(logger, name: str) -> bool:
return name in getattr(logger, 'meters', {}) or name in getattr(logger, '__dict__', {}) Try / catch
try:
value = getattr(metric_logger, metric_name)
except AttributeError as e:
value = None
print(f'Metric missing: {e}') Prevention
- Check meters keys when adding a new metric read
- Avoid hand-typing metric names; reference constants
- Log available metrics once at startup for debugging
When it happens
Trigger: Accessing metric.something on a MetricLogger where 'something' was never registered via meters, e.g. a typo like metric.losss or reading a metric before it was added with meters[key] = SmoothedValue().
Common situations: Typos in metric names during train loop logging; expecting a metric that only exists in another repo version; accessing attributes before first training step populated them.
Related errors
- '{}' object has no attribute '{}'
- '{}' object has no attribute '{}'
- not support data format '{self.data_format}'
- image: {} isn't RGB mode.
- Transformer input dimension should be divisible by head dime
AI-assisted analysis of WZMIAOMIAO/deep-learning-for-image-processing@1ec3fe6f37 (2026-08-30).
Data as JSON: /api/errors/2f043e5e92d4da64.
Report an issue: GitHub.