예제 #1
0
def test_samples():
    """Tests setting and getting the number of samples"""

    # Default should be None
    assert settings.get_samples() is None

    # Should be able to change to an int > 0
    settings.set_samples(1)
    assert settings.get_samples() == 1
    settings.set_samples(10)
    assert settings.get_samples() == 10
    settings.set_samples(None)
    assert settings.get_samples() is None

    # But not anything <1
    with pytest.raises(ValueError):
        settings.set_samples(0)
    with pytest.raises(ValueError):
        settings.set_samples(-1)

    # And it has to be an int
    with pytest.raises(TypeError):
        settings.set_samples(3.14)
    with pytest.raises(TypeError):
        settings.set_samples("lalala")
예제 #2
0
파일: dense.py 프로젝트: stnkl/probflow
    def __call__(self, x):
        """Perform the forward pass"""

        x = to_tensor(x)

        # Using the Flipout estimator
        if (get_flipout() and self.flipout and self.probabilistic
                and get_samples() is not None and get_samples() == 1):

            # Flipout-estimated weight samples
            s = O.rand_rademacher(O.shape(x))
            r = O.rand_rademacher([O.shape(x)[0], self.d_out])
            norm_samples = O.randn([self.d_in, self.d_out])
            w_samples = self.weights.variables["scale"] * norm_samples
            w_noise = r * ((x * s) @ w_samples)
            w_outputs = x @ self.weights.variables["loc"] + w_noise

            # Flipout-estimated bias samples
            r = O.rand_rademacher([O.shape(x)[0], self.d_out])
            norm_samples = O.randn([self.d_out])
            b_samples = self.bias.variables["scale"] * norm_samples
            b_outputs = self.bias.variables["loc"] + r * b_samples

            return w_outputs + b_outputs

        # Without Flipout
        else:
            return x @ self.weights() + self.bias()
예제 #3
0
def test_sampling():
    """Tests the Sampling context manager"""

    # Defaults before sampling
    assert settings.get_backend() == "tensorflow"
    assert settings.get_samples() is None
    assert settings.get_flipout() is False

    # Default should be samples=1 and flipout=False
    with settings.Sampling():
        assert settings.get_samples() == 1
        assert settings.get_flipout() is False

    # Should return to defaults after sampling
    assert settings.get_backend() == "tensorflow"
    assert settings.get_samples() is None
    assert settings.get_flipout() is False

    # Should be able to set samples and flipout via kwargs
    with settings.Sampling(n=100, flipout=True):
        assert settings.get_samples() == 100
        assert settings.get_flipout() is True

    # Again should return to defaults after __exit__
    assert settings.get_backend() == "tensorflow"
    assert settings.get_samples() is None
    assert settings.get_flipout() is False
예제 #4
0
    def __call__(self):
        """Return a sample from or the MAP estimate of this parameter.

        Returns
        -------
        sample : Tensor
            A sample from this Parameter's variational posterior distribution
        """
        n_samples = get_samples()
        if n_samples is None:
            return self.transform(self.posterior.mean())
        elif n_samples == 1:
            return self.transform(self.posterior.sample())
        else:
            return self.transform(self.posterior.sample(n_samples))
예제 #5
0
def test_sampling():
    """Tests the Sampling context manager"""

    # Defaults before sampling
    assert settings.get_backend() == "tensorflow"
    assert settings.get_samples() is None
    assert settings.get_flipout() is False
    assert settings.get_static_sampling_uuid() is None

    # Default should be Not to change anything
    with settings.Sampling():
        assert settings.get_backend() == "tensorflow"
        assert settings.get_samples() is None
        assert settings.get_flipout() is False
        assert settings.get_static_sampling_uuid() is None

    # Should be able to set samples and flipout via kwargs
    with settings.Sampling(n=100, flipout=True):
        assert settings.get_backend() == "tensorflow"
        assert settings.get_samples() == 100
        assert settings.get_flipout() is True
        assert settings.get_static_sampling_uuid() is None

    # Should return to defaults after sampling
    assert settings.get_backend() == "tensorflow"
    assert settings.get_samples() is None
    assert settings.get_flipout() is False
    assert settings.get_static_sampling_uuid() is None

    # Should be able to set static sampling uuid
    with settings.Sampling(static=True):
        assert settings.get_backend() == "tensorflow"
        assert settings.get_samples() is None
        assert settings.get_flipout() is False
        assert settings.get_static_sampling_uuid() is not None
        assert isinstance(settings.get_static_sampling_uuid(), uuid.UUID)

    # Should return to defaults after sampling
    assert settings.get_backend() == "tensorflow"
    assert settings.get_samples() is None
    assert settings.get_flipout() is False
    assert settings.get_static_sampling_uuid() is None

    # Should be able to nest sampling context managers
    with settings.Sampling(static=True):
        assert settings.get_backend() == "tensorflow"
        assert settings.get_samples() is None
        assert settings.get_flipout() is False
        assert settings.get_static_sampling_uuid() is not None
        assert isinstance(settings.get_static_sampling_uuid(), uuid.UUID)
        with settings.Sampling(n=100, flipout=True):
            assert settings.get_backend() == "tensorflow"
            assert settings.get_samples() == 100
            assert settings.get_flipout() is True
            assert settings.get_static_sampling_uuid() is not None
            assert isinstance(settings.get_static_sampling_uuid(), uuid.UUID)

    # Should return to defaults after sampling
    assert settings.get_backend() == "tensorflow"
    assert settings.get_samples() is None
    assert settings.get_flipout() is False
    assert settings.get_static_sampling_uuid() is None