class_docstr: Softmax activation function
  :math:`\\varphi(\\mathbf{x})_j =
  \\frac{e^{\mathbf{x}_j}}{\sum_{k=1}^K e^{\mathbf{x}_k}}`
  where :math:`K` is the total number of neurons in the layer. This
  activation function gets applied row-wise.
class_docstr_tok: ["Softmax","activation","function",":","math",":","`","\\\\varphi","(","\\\\mathbf","{","x","}",")","_j","=","\\\\frac","{","e^","{","\\mathbf","{","x","}","_j","}","}","{","\\sum_","{","k=1","}","^K","e^","{","\\mathbf","{","x","}","_k","}","}","`","where",":","math",":","`","K","`","is","the","total","number","of","neurons","in","the","layer",".","This","activation","function","gets","applied","row-wise","."]
code: def perform(self, node, input_storage, output_storage):
      (x,) = input_storage
      (z,) = output_storage
      z[0] = scipy.special.softmax(x, axis=self.axis)
  
imports: from textwrap import dedent
  import numpy
  import scipy
  from pytensor.graph.basic import Apply
  from pytensor.graph.replace import _vectorize_node
  from pytensor.link.c.op import COp
  from pytensor.tensor.basic import as_tensor_variable
  from pytensor.tensor.elemwise import get_normalized_batch_axes
  from pytensor.tensor.math import gamma, gammaln, neg, sum
label_desc: Use image node_id 3 for calling the Softmax obj's underlying member method code with example usage: obj.perform(node, input_storage, output_storage) without return types