Skip to content

Base Network Distributions

BaseNetDistribution

Base class for distribution of nets. This class sees nets as elements of distribution. It helps sample nets from this distribution or estimate statistics of distribution. For this purpose it have base module architecture and distribution of parameters for each of it weights.

Source code in src/methods/bayes/base/net_distribution.py
class BaseNetDistribution:
    """
    Base class for distribution of nets. This class sees nets as elements of distribution.
    It helps sample nets from this distribution or estimate statistics of distribution.
    For this purpose it have base module architecture and distribution of parameters for
    each of it weights.
    """

    def __init__(
        self, base_module: nn.Module, weight_distribution: dict[str, ParamDist]
    ) -> None:
        """_summary_

        Args:
            base_module (nn.Module): custom module layer which is going to be converted to BayesModule
            weight_distribution (dict[str, ParamDist]): posteror distribution for each parameter of moudule
        """
        super().__init__()
        self.base_module: nn.Module = base_module
        """Show default architecture of module for which should evalute parameters"""
        self.weight_distribution: dict[str, ParamDist] = weight_distribution
        """Distribution of parameter for each named parameter of base_module"""

    def detach_(self):
        """
        Detach(Made deepcopy) base module from original module
        """
        self.base_module = copy.deepcopy(self.base_module)

    def sample_params(self) -> dict[str, nn.Parameter]:
        """
        Sample only model parameter from distribution and
        return it.

        Returns:
            dict[str, nn.Parameter]: Return dict of sampled parameters, where
                key is name of parameter, value is valeu of parameter
        """
        param_sample_dict: dict[str, nn.Parameter] = {}
        for param_name, param_posterior in self.weight_distribution.items():
            param_sample = param_posterior.rsample()
            param_sample_dict[param_name] = nn.Parameter(param_sample)
            del_attr(self.base_module, param_name.split("."))
            set_attr(self.base_module, param_name.split("."), param_sample)
        return param_sample_dict

    def sample_model(self) -> nn.Module:
        """
        Sample only model from distribution and
        return it. Note that model is the same that in base_module.

        Returns:
            nn.Module: sampled base_module with sampled parameters
        """
        self.sample_params()
        return self.base_module

    def set_map_params(self) -> None:
        """
        Set MAP estimation parameters of model from distribution and
        set it. So it sets most probable model.
        """
        for param_name, dist in self.weight_distribution.items():
            pt = dist.map
            # pt = torch.nn.Parameter(pt.to_sparse())
            set_attr(self.base_module, param_name.split("."), pt)

    def set_mean_params(self) -> None:
        """
        Set unbaised estimation parameters of model from distribution and
        set it. So it sets model that would be returned at means.
        """
        for param_name, dist in self.weight_distribution.items():
            pt = dist.mean
            # pt = torch.nn.Parameter(pt.to_sparse())
            set_attr(self.base_module, param_name.split("."), pt)

    def __replace_with_parameters(self) -> None:
        """
        Replace parameters of base_module wit nn.Parameters
        """
        for param_name in self.weight_distribution.keys():
            pt = get_attr(self.base_module, param_name.split("."))
            pt = nn.Parameter(pt)
            set_attr(self.base_module, param_name.split("."), pt)

    def get_model(self) -> nn.Module:
        """
        Get model with last set parameters. (It still we be the same model as in base_module)
        """
        self.__replace_with_parameters()
        return self.base_module

    def get_model_snapshot(self) -> nn.Module:
        """
        Get deepcopy of model with last set parameters.
        """
        return copy.deepcopy(self.get_model())

base_module: nn.Module = base_module instance-attribute

Show default architecture of module for which should evalute parameters

weight_distribution: dict[str, ParamDist] = weight_distribution instance-attribute

Distribution of parameter for each named parameter of base_module

__init__(base_module, weight_distribution)

summary

Parameters:

Name Type Description Default
base_module Module

custom module layer which is going to be converted to BayesModule

required
weight_distribution dict[str, ParamDist]

posteror distribution for each parameter of moudule

required
Source code in src/methods/bayes/base/net_distribution.py
def __init__(
    self, base_module: nn.Module, weight_distribution: dict[str, ParamDist]
) -> None:
    """_summary_

    Args:
        base_module (nn.Module): custom module layer which is going to be converted to BayesModule
        weight_distribution (dict[str, ParamDist]): posteror distribution for each parameter of moudule
    """
    super().__init__()
    self.base_module: nn.Module = base_module
    """Show default architecture of module for which should evalute parameters"""
    self.weight_distribution: dict[str, ParamDist] = weight_distribution
    """Distribution of parameter for each named parameter of base_module"""

__replace_with_parameters()

Replace parameters of base_module wit nn.Parameters

Source code in src/methods/bayes/base/net_distribution.py
def __replace_with_parameters(self) -> None:
    """
    Replace parameters of base_module wit nn.Parameters
    """
    for param_name in self.weight_distribution.keys():
        pt = get_attr(self.base_module, param_name.split("."))
        pt = nn.Parameter(pt)
        set_attr(self.base_module, param_name.split("."), pt)

detach_()

Detach(Made deepcopy) base module from original module

Source code in src/methods/bayes/base/net_distribution.py
def detach_(self):
    """
    Detach(Made deepcopy) base module from original module
    """
    self.base_module = copy.deepcopy(self.base_module)

get_model()

Get model with last set parameters. (It still we be the same model as in base_module)

Source code in src/methods/bayes/base/net_distribution.py
def get_model(self) -> nn.Module:
    """
    Get model with last set parameters. (It still we be the same model as in base_module)
    """
    self.__replace_with_parameters()
    return self.base_module

get_model_snapshot()

Get deepcopy of model with last set parameters.

Source code in src/methods/bayes/base/net_distribution.py
def get_model_snapshot(self) -> nn.Module:
    """
    Get deepcopy of model with last set parameters.
    """
    return copy.deepcopy(self.get_model())

sample_model()

Sample only model from distribution and return it. Note that model is the same that in base_module.

Returns:

Type Description
Module

nn.Module: sampled base_module with sampled parameters

Source code in src/methods/bayes/base/net_distribution.py
def sample_model(self) -> nn.Module:
    """
    Sample only model from distribution and
    return it. Note that model is the same that in base_module.

    Returns:
        nn.Module: sampled base_module with sampled parameters
    """
    self.sample_params()
    return self.base_module

sample_params()

Sample only model parameter from distribution and return it.

Returns:

Type Description
dict[str, Parameter]

dict[str, nn.Parameter]: Return dict of sampled parameters, where key is name of parameter, value is valeu of parameter

Source code in src/methods/bayes/base/net_distribution.py
def sample_params(self) -> dict[str, nn.Parameter]:
    """
    Sample only model parameter from distribution and
    return it.

    Returns:
        dict[str, nn.Parameter]: Return dict of sampled parameters, where
            key is name of parameter, value is valeu of parameter
    """
    param_sample_dict: dict[str, nn.Parameter] = {}
    for param_name, param_posterior in self.weight_distribution.items():
        param_sample = param_posterior.rsample()
        param_sample_dict[param_name] = nn.Parameter(param_sample)
        del_attr(self.base_module, param_name.split("."))
        set_attr(self.base_module, param_name.split("."), param_sample)
    return param_sample_dict

set_map_params()

Set MAP estimation parameters of model from distribution and set it. So it sets most probable model.

Source code in src/methods/bayes/base/net_distribution.py
def set_map_params(self) -> None:
    """
    Set MAP estimation parameters of model from distribution and
    set it. So it sets most probable model.
    """
    for param_name, dist in self.weight_distribution.items():
        pt = dist.map
        # pt = torch.nn.Parameter(pt.to_sparse())
        set_attr(self.base_module, param_name.split("."), pt)

set_mean_params()

Set unbaised estimation parameters of model from distribution and set it. So it sets model that would be returned at means.

Source code in src/methods/bayes/base/net_distribution.py
def set_mean_params(self) -> None:
    """
    Set unbaised estimation parameters of model from distribution and
    set it. So it sets model that would be returned at means.
    """
    for param_name, dist in self.weight_distribution.items():
        pt = dist.mean
        # pt = torch.nn.Parameter(pt.to_sparse())
        set_attr(self.base_module, param_name.split("."), pt)