WZMIAOMIAO/deep-learning-for-image-processing · error · AttributeError
'{}' object has no attribute '{}'
Error message
'{}' object has no attribute '{}' What it means
SmoothedValue/MetricLogger's __getattr__ looks up requested attributes in its meters dict and then its instance __dict__; if the attribute is in neither, it raises AttributeError. This typically surfaces as a typo of a loss/metric name logged via meter.meters keys.
Source
Thrown at pytorch_object_detection/mask_rcnn/train_utils/distributed_utils.py:137
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 metric_logger.meters keys (print them) and use an existing name
- Ensure the model's loss_dict keys are registered via metric_logger.update(loss_dict) before access
- Use hasattr(metric_logger, name) or metric_logger.meters.get(name) for optional metrics
Example fix
// before
avg_mask_loss = metric_logger.loss_mask.global_avg # may not exist
// after
if "loss_mask" in metric_logger.meters:
avg_mask_loss = metric_logger.loss_mask.global_avg Defensive patterns
Strategy: type-guard
Validate before calling
name = 'loss_mask'
if name in metric_logger.meters:
value = metric_logger.meters[name].global_avg
else:
logger.warning(f'meter {name} not registered') Type guard
def has_meter(logger_obj, name):
return name in getattr(logger_obj, 'meters', {}) Try / catch
try:
value = metric_logger.loss_mask.global_avg
except AttributeError as e:
logger.warning(f'missing meter: {e}; available: {list(metric_logger.meters)}')
value = None Prevention
- Register every loss key via metric_logger.update(loss_dict) each iteration
- Print metric_logger.meters keys when debugging
- Use .meters.get(name) for optional metrics
When it happens
Trigger: Accessing e.g. metric_logger.loss_mask when no 'loss_mask' meter was registered (update_losses never saw that key), or any attribute not added via meters.update/track.
Common situations: Accessing a loss key not produced by the model (name mismatch between model output dict and logger); reading stats before the first iteration; typos in attribute names.
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/a66c98728679056d.
Report an issue: GitHub.