diff --git a/CHANGELOG.md b/CHANGELOG.md index 65a30703b41..862f9a3c4c4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,8 +12,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Added Specificity metric ([#210](https://github.com/PyTorchLightning/metrics/pull/210)) -- Added `is_differentiable` property to `AUC`, `AUROC`, `CohenKappa` and `AveragePrecision` ([#178](https://github.com/PyTorchLightning/metrics/pull/178)) - +- Added `is_differentiable` property: + * To `AUC`, `AUROC`, `CohenKappa` and `AveragePrecision` ([#178](https://github.com/PyTorchLightning/metrics/pull/178)) + * To `PearsonCorrCoef`, `SpearmanCorrcoef`, `R2Score` and `ExplainedVariance` ([#225](https://github.com/PyTorchLightning/metrics/pull/225)) - Added `add_metrics` method to `MetricCollection` for adding additional metrics after initialization ([#221](https://github.com/PyTorchLightning/metrics/pull/221)) @@ -21,6 +22,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Added pre-gather reduction in the case of `dist_reduce_fx="cat"` to reduce communication cost ([#217](https://github.com/PyTorchLightning/metrics/pull/217)) + ### Changed - `MetricCollection` should return metrics with prefix on `items()`, `keys()` ([#209](https://github.com/PyTorchLightning/metrics/pull/209)) diff --git a/tests/regression/test_explained_variance.py b/tests/regression/test_explained_variance.py index dd1c37a4969..5e6fdc25fb3 100644 --- a/tests/regression/test_explained_variance.py +++ b/tests/regression/test_explained_variance.py @@ -85,6 +85,12 @@ def test_explained_variance_functional(self, multioutput, preds, target, sk_metr metric_args=dict(multioutput=multioutput), ) + def test_explained_variance_differentiability(self, multioutput, preds, target, sk_metric): + self.run_differentiability_test( + preds=preds, target=target, metric_module=ExplainedVariance, metric_functional=explained_variance, + metric_args={'multioutput': multioutput} + ) + @pytest.mark.skipif( not _TORCH_GREATER_EQUAL_1_6, reason='half support of core operations on not support before pytorch v1.6' ) diff --git a/tests/regression/test_pearson.py b/tests/regression/test_pearson.py index 91ecc56489e..6c17ab0293e 100644 --- a/tests/regression/test_pearson.py +++ b/tests/regression/test_pearson.py @@ -69,6 +69,11 @@ def test_pearson_corrcoef_functional(self, preds, target): preds=preds, target=target, metric_functional=pearson_corrcoef, sk_metric=_sk_pearsonr ) + def test_pearson_corrcoef_differentiability(self, preds, target): + self.run_differentiability_test( + preds=preds, target=target, metric_module=PearsonCorrcoef, metric_functional=pearson_corrcoef + ) + # Pearson half + cpu does not work due to missing support in torch.sqrt @pytest.mark.xfail(reason="PearsonCorrcoef metric does not support cpu + half precision") def test_pearson_corrcoef_half_cpu(self, preds, target): diff --git a/tests/regression/test_r2score.py b/tests/regression/test_r2score.py index 699d6d67f11..b1ffd2cc0fb 100644 --- a/tests/regression/test_r2score.py +++ b/tests/regression/test_r2score.py @@ -93,6 +93,12 @@ def test_r2_functional(self, adjusted, multioutput, preds, target, sk_metric, nu metric_args=dict(adjusted=adjusted, multioutput=multioutput), ) + def test_r2_differentiabilit(self, adjusted, multioutput, preds, target, sk_metric, num_outputs): + self.run_differentiability_test( + preds=preds, target=target, metric_module=partial(R2Score, num_outputs=num_outputs), + metric_functional=r2score, metric_args=dict(adjusted=adjusted, multioutput=multioutput) + ) + @pytest.mark.skipif( not _TORCH_GREATER_EQUAL_1_6, reason='half support of core operations on not support before pytorch v1.6' ) diff --git a/tests/regression/test_spearman.py b/tests/regression/test_spearman.py index 45e64f65e8c..64cc1efed73 100644 --- a/tests/regression/test_spearman.py +++ b/tests/regression/test_spearman.py @@ -82,6 +82,11 @@ def test_spearman_corrcoef(self, preds, target, ddp, dist_sync_on_step): def test_spearman_corrcoef_functional(self, preds, target): self.run_functional_metric_test(preds, target, spearman_corrcoef, _sk_metric) + def test_spearman_corrcoef_differentiability(self, preds, target): + self.run_differentiability_test( + preds=preds, target=target, metric_module=SpearmanCorrcoef, metric_functional=spearman_corrcoef + ) + # Spearman half + cpu does not work due to missing support in torch.arange @pytest.mark.xfail(reason="Spearman metric does not support cpu + half precision") def test_spearman_corrcoef_half_cpu(self, preds, target): diff --git a/torchmetrics/regression/explained_variance.py b/torchmetrics/regression/explained_variance.py index a76980135dc..f5e3b2de186 100644 --- a/torchmetrics/regression/explained_variance.py +++ b/torchmetrics/regression/explained_variance.py @@ -131,3 +131,7 @@ def compute(self): self.sum_squared_target, self.multioutput, ) + + @property + def is_differentiable(self): + return True diff --git a/torchmetrics/regression/pearson.py b/torchmetrics/regression/pearson.py index f6e56065f49..21196c50a38 100644 --- a/torchmetrics/regression/pearson.py +++ b/torchmetrics/regression/pearson.py @@ -96,3 +96,7 @@ def compute(self): preds = dim_zero_cat(self.preds) target = dim_zero_cat(self.target) return _pearson_corrcoef_compute(preds, target) + + @property + def is_differentiable(self): + return True diff --git a/torchmetrics/regression/r2score.py b/torchmetrics/regression/r2score.py index c5ee7a8b534..96b86a5e397 100644 --- a/torchmetrics/regression/r2score.py +++ b/torchmetrics/regression/r2score.py @@ -145,3 +145,7 @@ def compute(self) -> Tensor: return _r2score_compute( self.sum_squared_error, self.sum_error, self.residual, self.total, self.adjusted, self.multioutput ) + + @property + def is_differentiable(self): + return True diff --git a/torchmetrics/regression/spearman.py b/torchmetrics/regression/spearman.py index b7ac2c31288..3bb0d39ed28 100644 --- a/torchmetrics/regression/spearman.py +++ b/torchmetrics/regression/spearman.py @@ -94,3 +94,7 @@ def compute(self): preds = dim_zero_cat(self.preds) target = dim_zero_cat(self.target) return _spearman_corrcoef_compute(preds, target) + + @property + def is_differentiable(self): + return False