How to Implement a Custom ModelΒΆ

You have to extend the noether.core.models.Model class and implement the __init__ and noether.core.models.Model.forward() methods Additionally, you will need to create a corresponding model configuration class that extends noether.core.schemas.models.ModelBaseConfig to define the model-specific parameters.

from noether.core.models import Model
from noether.core.schemas.models import ModelBaseConfig

class CustomModelConfig(ModelBaseConfig):
    input_dim: int
    hidden_dim: int
    output_dim: int

class CustomModel(Model):
    def __init__(self, model_config: CustomModelConfig, **kwargs):
        # the model config needs to be passed to the parent Model class
        super().__init__(model_config=model_config, **kwargs)

        self.config = model_config

        # Define your model layers here
        self.encoder = torch.nn.Linear(model_config.input_dim, model_config.hidden_dim)
        self.decoder = torch.nn.Linear(model_config.hidden_dim, model_config.output_dim)

    def forward(self, input_tensor: torch.Tensor) -> dict[str, torch.Tensor]:
        """
        Forward pass of the model.

        Args:
            input_tensor: torch tensor with data

        Returns:
            Dictionary containing model outputs.
        """
        # Example: extract inputs from batch
        x = input_tensor

        # Forward pass
        hidden = self.encoder(x)
        output = self.decoder(hidden)

        return {'output':output}

An example configuration for this custom model in YAML format would look like this:

kind: path.to.CustomModel
name: custom_model
input_dim: 3
hidden_dim: 128
output_dim: 1
optimizer_config: ${optimizer}  # Reference to optimizer defined elsewhere
forward_properties:
  - input_tensor