Follow-up question when trying to avoid this error.
Is there a way to check if a Metric is loggable? I’m going over a dict with metrics to log them, but I’m also hit with the ValueError: only one element tensors can be converted to Python scalars
.
I checked the insides:
> model.metrics["metric_val"]["confmat"].__dict__
{'training': False,
'_parameters': OrderedDict(),
'_buffers': OrderedDict([('confmat',
tensor([[0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0.]], device='cuda:0'))]),
'_non_persistent_buffers_set': set(),
'_backward_hooks': OrderedDict(),
'_forward_hooks': OrderedDict(),
'_forward_pre_hooks': OrderedDict(),
'_state_dict_hooks': OrderedDict(),
'_load_state_dict_pre_hooks': OrderedDict(),
'_modules': OrderedDict(),
'dist_sync_on_step': False,
'compute_on_step': True,
'process_group': None,
'_to_sync': True,
'update': <function pytorch_lightning.metrics.classification.confusion_matrix.ConfusionMatrix.update(preds: torch.Tensor, target: torch.Tensor)>,
'compute': <function pytorch_lightning.metrics.classification.confusion_matrix.ConfusionMatrix.compute() -> torch.Tensor>,
'_computed': tensor([[4., 5., 4., 1., 6., 2.],
[3., 1., 3., 1., 3., 4.],
[0., 2., 1., 4., 2., 1.],
[1., 3., 3., 5., 1., 2.],
[1., 4., 2., 2., 4., 0.],
[0., 2., 2., 3., 0., 3.]], device='cuda:0'),
'_forward_cache': tensor([[0., 1., 0., 0., 1., 0.],
[0., 0., 0., 0., 0., 0.],
[0., 0., 0., 1., 0., 0.],
[0., 0., 0., 0., 0., 0.],
[0., 1., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 1.]], device='cuda:0'),
'_reductions': {'confmat': <function pytorch_lightning.metrics.utils.dim_zero_sum(x)>},
'_defaults': {'confmat': tensor([[0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0.]])},
'num_classes': 6,
'normalize': None,
'threshold': 0.5,
'_cache': {'confmat': tensor([[4., 5., 4., 1., 6., 2.],
[3., 1., 3., 1., 3., 4.],
[0., 2., 1., 4., 2., 1.],
[1., 3., 3., 5., 1., 2.],
[1., 4., 2., 2., 4., 0.],
[0., 2., 2., 3., 0., 3.]], device='cuda:0')}}
However, a solution like this proved not to be robust:
# only log scalars (e.g. not confusion matrix)
if metric._computed.numel() == 1:
self.log(f"{metric_name}/{phase}_step", metric)