code: def test_valid_axis(self):
      with pytest.raises(TypeError):
          SoftmaxGrad(1.5)
  
      x = [tensor3()] * SoftmaxGrad.nin
      SoftmaxGrad(2)(*x)
      SoftmaxGrad(-3)(*x)
  
      with pytest.raises(ValueError):
          SoftmaxGrad(3)(*x)
  
      with pytest.raises(ValueError):
          SoftmaxGrad(-4)(*x)
  
imports: import numpy
  import pytest
  from scipy.special import beta
  from scipy.special import factorial
  from scipy.special import log_softmax
  from scipy.special import poch
  from scipy.special import softmax
  from pytensor.compile.function import function
  from pytensor.configdefaults import config
  from pytensor.graph.replace import vectorize_node
  from pytensor.tensor.blockwise import Blockwise
  from pytensor.tensor.special import LogSoftmax, Softmax, SoftmaxGrad, beta, betaln, factorial, log_softmax, poch, softmax
  from pytensor.tensor.type import matrix, tensor, tensor3, tensor4, vector, vectors
  from tests import unittest_tools
  from tests.tensor.utils import random_ranged
label_desc: Use image node_id 2 for calling the TestSoftmaxGrad obj's underlying member method code with example usage: obj.test_valid_axis() without return types