From cbf4976f07c086d9483ac9356a9c22721ab6c566 Mon Sep 17 00:00:00 2001 From: Gerhardsa0 Date: Mon, 13 May 2024 16:27:17 +0200 Subject: [PATCH 1/4] chaged on request --- .../data/labeled/containers/_time_series_dataset.py | 8 ++++---- src/safeds/ml/nn/_model.py | 1 + src/safeds/ml/nn/_output_conversion_time_series.py | 2 +- tests/safeds/ml/nn/test_forward_workflow.py | 6 +++--- 4 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/safeds/data/labeled/containers/_time_series_dataset.py b/src/safeds/data/labeled/containers/_time_series_dataset.py index 811996d6a..9b974f328 100644 --- a/src/safeds/data/labeled/containers/_time_series_dataset.py +++ b/src/safeds/data/labeled/containers/_time_series_dataset.py @@ -326,8 +326,8 @@ def _create_dataset(features: torch.Tensor, target: torch.Tensor) -> Dataset: class _CustomDataset(Dataset): def __init__(self, features_dataset: torch.Tensor, target_dataset: torch.Tensor): - self.X = features_dataset - self.Y = target_dataset.unsqueeze(-1) + self.X = features_dataset.float() + self.Y = target_dataset.unsqueeze(-1).float() self.len = self.X.shape[0] def __getitem__(self, item: int) -> tuple[torch.Tensor, torch.Tensor]: @@ -345,8 +345,8 @@ def _create_dataset_predict(features: torch.Tensor) -> Dataset: _init_default_device() class _CustomDataset(Dataset): - def __init__(self, features: torch.Tensor): - self.X = features + def __init__(self, datas: torch.Tensor): + self.X = datas.float() self.len = self.X.shape[0] def __getitem__(self, item: int) -> torch.Tensor: diff --git a/src/safeds/ml/nn/_model.py b/src/safeds/ml/nn/_model.py index 8dfbc9f74..79733af7b 100644 --- a/src/safeds/ml/nn/_model.py +++ b/src/safeds/ml/nn/_model.py @@ -240,6 +240,7 @@ def predict(self, test_data: IPT) -> OT: predictions = [] with torch.no_grad(): for x in dataloader: + print(x.type()) elem = self._model(x) predictions.append(elem.squeeze(dim=1)) return self._output_conversion._data_conversion( diff --git a/src/safeds/ml/nn/_output_conversion_time_series.py b/src/safeds/ml/nn/_output_conversion_time_series.py index dadfd03b5..4b8ddb1b6 100644 --- a/src/safeds/ml/nn/_output_conversion_time_series.py +++ b/src/safeds/ml/nn/_output_conversion_time_series.py @@ -78,7 +78,7 @@ def _data_conversion(self, input_data: TimeSeriesDataset, output_data: Tensor, * window_size: int = kwargs["window_size"] forecast_horizon: int = kwargs["forecast_horizon"] input_data_table = input_data.to_table() - input_data_table = Table.from_rows(input_data_table.to_rows()[window_size + forecast_horizon :]) + input_data_table = input_data_table.slice_rows(start=window_size+forecast_horizon) return input_data_table.add_columns( [Column(self._prediction_name, output_data.tolist())], diff --git a/tests/safeds/ml/nn/test_forward_workflow.py b/tests/safeds/ml/nn/test_forward_workflow.py index 1256c94f5..64f6807b8 100644 --- a/tests/safeds/ml/nn/test_forward_workflow.py +++ b/tests/safeds/ml/nn/test_forward_workflow.py @@ -24,8 +24,8 @@ def test_forward_model(device: Device) -> None: path=resolve_resource_path(_inflation_path), ) table_1 = table_1.remove_columns(["date"]) - table_2 = Table.from_rows(table_1.to_rows()[:-14]) - table_2 = table_2.add_columns([Table.from_rows(table_1.to_rows()[14:]).get_column("value").rename("target")]) + table_2 = table_1.slice_rows(start=0, length=table_1.number_of_rows-14) + table_2 = table_2.add_columns([(table_1.slice_rows(start=14)).get_column("value").rename("target")]) train_table, test_table = table_2.split_rows(0.8) ss = StandardScaler() @@ -38,5 +38,5 @@ def test_forward_model(device: Device) -> None: ) fitted_model = model.fit(train_table.to_tabular_dataset("target"), epoch_size=1, learning_rate=0.01) - fitted_model.predict(test_table.keep_only_columns(["value"])) + fitted_model.predict(test_table.remove_columns_except(["value"])) assert model._model.state_dict()["_pytorch_layers.0._layer.weight"].device == _get_device() From 7b0610a7d925f7ce32c1c05afa3484cbc5e9f60a Mon Sep 17 00:00:00 2001 From: megalinter-bot <129584137+megalinter-bot@users.noreply.github.com> Date: Mon, 13 May 2024 14:30:38 +0000 Subject: [PATCH 2/4] style: apply automated linter fixes --- src/safeds/ml/nn/_output_conversion_time_series.py | 4 ++-- tests/safeds/ml/nn/test_forward_workflow.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/safeds/ml/nn/_output_conversion_time_series.py b/src/safeds/ml/nn/_output_conversion_time_series.py index 4b8ddb1b6..8b87d94a2 100644 --- a/src/safeds/ml/nn/_output_conversion_time_series.py +++ b/src/safeds/ml/nn/_output_conversion_time_series.py @@ -8,7 +8,7 @@ if TYPE_CHECKING: from torch import Tensor from safeds.data.labeled.containers import TimeSeriesDataset -from safeds.data.tabular.containers import Column, Table +from safeds.data.tabular.containers import Column from safeds.ml.nn._output_conversion import OutputConversion @@ -78,7 +78,7 @@ def _data_conversion(self, input_data: TimeSeriesDataset, output_data: Tensor, * window_size: int = kwargs["window_size"] forecast_horizon: int = kwargs["forecast_horizon"] input_data_table = input_data.to_table() - input_data_table = input_data_table.slice_rows(start=window_size+forecast_horizon) + input_data_table = input_data_table.slice_rows(start=window_size + forecast_horizon) return input_data_table.add_columns( [Column(self._prediction_name, output_data.tolist())], diff --git a/tests/safeds/ml/nn/test_forward_workflow.py b/tests/safeds/ml/nn/test_forward_workflow.py index 64f6807b8..5648c9610 100644 --- a/tests/safeds/ml/nn/test_forward_workflow.py +++ b/tests/safeds/ml/nn/test_forward_workflow.py @@ -24,7 +24,7 @@ def test_forward_model(device: Device) -> None: path=resolve_resource_path(_inflation_path), ) table_1 = table_1.remove_columns(["date"]) - table_2 = table_1.slice_rows(start=0, length=table_1.number_of_rows-14) + table_2 = table_1.slice_rows(start=0, length=table_1.number_of_rows - 14) table_2 = table_2.add_columns([(table_1.slice_rows(start=14)).get_column("value").rename("target")]) train_table, test_table = table_2.split_rows(0.8) From 17b9383d12ba704efb81efca1dd06e7e56e812ed Mon Sep 17 00:00:00 2001 From: Lars Reimann Date: Mon, 13 May 2024 17:13:10 +0200 Subject: [PATCH 3/4] chore: remove print --- src/safeds/ml/nn/_model.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/safeds/ml/nn/_model.py b/src/safeds/ml/nn/_model.py index c3d0aa725..8f80a25ac 100644 --- a/src/safeds/ml/nn/_model.py +++ b/src/safeds/ml/nn/_model.py @@ -239,7 +239,6 @@ def predict(self, test_data: IPT) -> OT: predictions = [] with torch.no_grad(): for x in dataloader: - print(x.type()) elem = self._model(x) predictions.append(elem.squeeze(dim=1)) return self._output_conversion._data_conversion( From a508b9a9d582323029ee027e780ee59a8873ed13 Mon Sep 17 00:00:00 2001 From: Lars Reimann Date: Mon, 13 May 2024 17:17:20 +0200 Subject: [PATCH 4/4] test: fix some failing tests --- src/safeds/data/labeled/containers/_image_dataset.py | 5 ++++- .../containers/_time_series_dataset/test_into_dataloader.py | 6 +++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/safeds/data/labeled/containers/_image_dataset.py b/src/safeds/data/labeled/containers/_image_dataset.py index b4dd21c34..8722f2be4 100644 --- a/src/safeds/data/labeled/containers/_image_dataset.py +++ b/src/safeds/data/labeled/containers/_image_dataset.py @@ -294,7 +294,10 @@ def __init__(self, table: Table) -> None: _init_default_device() self._column_names = table.column_names - self._tensor = torch.Tensor(table._data_frame.to_torch()).to(_get_device()) + if table.number_of_rows == 0: + self._tensor = torch.empty((0, table.number_of_columns), dtype=torch.float32).to(_get_device()) + else: + self._tensor = table._data_frame.to_torch().to(_get_device()) if not torch.all(self._tensor.sum(dim=1) == torch.ones(self._tensor.size(dim=0))): raise ValueError( diff --git a/tests/safeds/data/labeled/containers/_time_series_dataset/test_into_dataloader.py b/tests/safeds/data/labeled/containers/_time_series_dataset/test_into_dataloader.py index 483f75e45..6437363ac 100644 --- a/tests/safeds/data/labeled/containers/_time_series_dataset/test_into_dataloader.py +++ b/tests/safeds/data/labeled/containers/_time_series_dataset/test_into_dataloader.py @@ -175,7 +175,7 @@ def test_should_create_dataloader_invalid( 1, 0, OutOfBoundsError, - r"forecast_horizon \(=0\) is not inside \[1, \u221e\).", + None, ), ( Table( @@ -189,7 +189,7 @@ def test_should_create_dataloader_invalid( 0, 1, OutOfBoundsError, - r"window_size \(=0\) is not inside \[1, \u221e\).", + None, ), ], ids=[ @@ -204,7 +204,7 @@ def test_should_create_dataloader_predict_invalid( window_size: int, forecast_horizon: int, error_type: type[ValueError], - error_msg: str, + error_msg: str | None, device: Device, ) -> None: configure_test_with_device(device)