WZMIAOMIAO/deep-learning-for-image-processing · error · AttributeError
'{}' object has no attribute '{}'
Error message
'{}' object has no attribute '{}' What it means
MetricLogger.__getattr__ in unet/train_utils raises AttributeError when the requested attribute is neither a registered meter (in self.meters) nor an instance attribute. It's a deliberate fail-loud check so typos on the metric logger surface immediately.
Source
Thrown at pytorch_segmentation/unet/train_utils/distributed_utils.py:187
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
- Correct the attribute name to a registered meter (loss, lr, ...)
- Ensure the meter is assigned before access: metric_logger.xxx = SmoothedValue()
- Use hasattr(metric_logger, name) or name in metric_logger.meters before reading
Example fix
// before print(metric_logger.acc.global_avg) // after print(metric_logger.loss.global_avg) # 'acc' was never registered on MetricLogger
Defensive patterns
Strategy: validation
Validate before calling
required = ['loss', 'lr']
missing = [r for r in required if r not in metric_logger.meters]
assert not missing, f"unregistered meters: {missing}" Type guard
def meter_exists(logger, name: str) -> bool:
return name in logger.meters Try / catch
try:
avg_loss = metric_logger.loss.global_avg
except AttributeError as e:
avg_loss = None
print(f"meter missing: {e}") Prevention
- Initialize all meters in one setup function before training
- Search codebase for old meter names after refactors
- Prefer iterating metric_logger.meters over hardcoding attribute names
When it happens
Trigger: Accessing e.g. metric_logger.losses or metric_logger.meterss, or reading a meter that was never set via __setattr__ (never assigned a SmoothedValue) before the first update call.
Common situations: Typos in training scripts, reading metrics before train_one_epoch populates them, divergence between meter names in train vs eval code paths.
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/92cfcf593cb491e7.
Report an issue: GitHub.