code: def test_concat(self):
      axis = 0
      input_shape = [2, 3]
      output_shape = [4, 3]
      x1_val = np.random.random(input_shape)
      x2_val = np.random.random(input_shape)
  
      # Create input (ValueInfoProto)
      X = onnx.helper.make_tensor_value_info(
          "X", onnx.TensorProto.FLOAT, input_shape
      )
      X1 = onnx.helper.make_tensor_value_info(
          "X1", onnx.TensorProto.FLOAT, input_shape
      )
      X2 = onnx.helper.make_tensor_value_info(
          "X2", onnx.TensorProto.FLOAT, input_shape
      )
  
      # Create one output (ValueInfoProto)
      Y = onnx.helper.make_tensor_value_info(
          "Y", onnx.TensorProto.FLOAT, output_shape
      )
  
      # Create a node (NodeProto)
      const_X1 = onnx.helper.make_node(
          op_type="Constant",
          inputs=[],
          outputs=["X1"],
          value=onnx.helper.make_tensor(
              name="X1",
              data_type=onnx.TensorProto.FLOAT,
              dims=input_shape,
              vals=x1_val.flatten().tolist(),
          ),
      )
  
      const_X2 = onnx.helper.make_node(
          op_type="Constant",
          inputs=[],
          outputs=["X2"],
          value=onnx.helper.make_tensor(
              name="X2",
              data_type=onnx.TensorProto.FLOAT,
              dims=input_shape,
              vals=x2_val.flatten().tolist(),
          ),
      )
  
      concat_node = onnx.helper.make_node(
          op_type="Concat",  # node name
          inputs=["X1", "X2"],  # inputs
          outputs=["Y"],  # outputs
          axis=axis,
      )
  
      # Create the graph (GraphProto)
      onnx_graph = onnx.helper.make_graph(
          nodes=[const_X1, const_X2, concat_node],
          name="test-concat",
          inputs=[X],
          outputs=[Y],
      )
  
      # Create the model (ModelProto)
      onnx_model = onnx.helper.make_model(
          onnx_graph, producer_name="ONNX"
      )
      onnx.checker.check_model(onnx_model)
  
      loaded_model = load_model_proto(onnx_model)
      bigdl_model = JoinTable(
          dimension=axis + 1, n_input_dims=len(input_shape)
      )
  
      loaded_out = loaded_model.forward([x1_val, x2_val])
      expected_out = bigdl_model.forward([x1_val, x2_val])
  
      assert np.array_equal(loaded_out, expected_out)
  
imports: import onnx
  import pytest
  import numpy
  from bigdl.dllib.contrib.onnx.onnx_loader import load_model_proto
  from bigdl.dllib.nn.layer import CAddTable, JoinTable, ReLU
  from bigdl.dllib.nn.layer import SoftMax, SpatialAveragePooling, SpatialBatchNormalization
  from bigdl.dllib.nn.layer import SpatialConvolution, SpatialMaxPooling
  from bigdl.dllib.nn.layer import Unsqueeze
  from bigdl.dllib.nn.onnx.layer import Gemm, Reshape, Shape
label_desc: Use image node_id 1 for calling the TestConcat obj's underlying member method code with example usage: obj.test_concat() without return types