123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109 |
- import numpy as np
- from numpy.testing import assert_allclose
- import pytest
- import scipy.special as sc
- @pytest.mark.parametrize('x, expected', [
- (np.array([1000, 1]), np.array([0, -999])),
- # Expected value computed using mpmath (with mpmath.mp.dps = 200) and then
- # converted to float.
- (np.arange(4), np.array([-3.4401896985611953,
- -2.4401896985611953,
- -1.4401896985611953,
- -0.44018969856119533]))
- ])
- def test_log_softmax(x, expected):
- assert_allclose(sc.log_softmax(x), expected, rtol=1e-13)
- @pytest.fixture
- def log_softmax_x():
- x = np.arange(4)
- return x
- @pytest.fixture
- def log_softmax_expected():
- # Expected value computed using mpmath (with mpmath.mp.dps = 200) and then
- # converted to float.
- expected = np.array([-3.4401896985611953,
- -2.4401896985611953,
- -1.4401896985611953,
- -0.44018969856119533])
- return expected
- def test_log_softmax_translation(log_softmax_x, log_softmax_expected):
- # Translation property. If all the values are changed by the same amount,
- # the softmax result does not change.
- x = log_softmax_x + 100
- expected = log_softmax_expected
- assert_allclose(sc.log_softmax(x), expected, rtol=1e-13)
- def test_log_softmax_noneaxis(log_softmax_x, log_softmax_expected):
- # When axis=None, softmax operates on the entire array, and preserves
- # the shape.
- x = log_softmax_x.reshape(2, 2)
- expected = log_softmax_expected.reshape(2, 2)
- assert_allclose(sc.log_softmax(x), expected, rtol=1e-13)
- @pytest.mark.parametrize('axis_2d, expected_2d', [
- (0, np.log(0.5) * np.ones((2, 2))),
- (1, np.array([[0, -999], [0, -999]]))
- ])
- def test_axes(axis_2d, expected_2d):
- assert_allclose(
- sc.log_softmax([[1000, 1], [1000, 1]], axis=axis_2d),
- expected_2d,
- rtol=1e-13,
- )
- @pytest.fixture
- def log_softmax_2d_x():
- x = np.arange(8).reshape(2, 4)
- return x
- @pytest.fixture
- def log_softmax_2d_expected():
- # Expected value computed using mpmath (with mpmath.mp.dps = 200) and then
- # converted to float.
- expected = np.array([[-3.4401896985611953,
- -2.4401896985611953,
- -1.4401896985611953,
- -0.44018969856119533],
- [-3.4401896985611953,
- -2.4401896985611953,
- -1.4401896985611953,
- -0.44018969856119533]])
- return expected
- def test_log_softmax_2d_axis1(log_softmax_2d_x, log_softmax_2d_expected):
- x = log_softmax_2d_x
- expected = log_softmax_2d_expected
- assert_allclose(sc.log_softmax(x, axis=1), expected, rtol=1e-13)
- def test_log_softmax_2d_axis0(log_softmax_2d_x, log_softmax_2d_expected):
- x = log_softmax_2d_x.T
- expected = log_softmax_2d_expected.T
- assert_allclose(sc.log_softmax(x, axis=0), expected, rtol=1e-13)
- def test_log_softmax_3d(log_softmax_2d_x, log_softmax_2d_expected):
- # 3-d input, with a tuple for the axis.
- x_3d = log_softmax_2d_x.reshape(2, 2, 2)
- expected_3d = log_softmax_2d_expected.reshape(2, 2, 2)
- assert_allclose(sc.log_softmax(x_3d, axis=(1, 2)), expected_3d, rtol=1e-13)
- def test_log_softmax_scalar():
- assert_allclose(sc.log_softmax(1.0), 0.0, rtol=1e-13)
|