class_docstr: Currently we only use it to infer caffe shape, we use tensorflow engine
  to infer tensorflow op shapes, since tensorflow has too many ops.
class_docstr_tok: ["Currently","we","only","use","it","to","infer","caffe","shape",",","we","use","tensorflow","engine","to","infer","tensorflow","op","shapes",",","since","tensorflow","has","too","many","ops","."]
code: def infer_shape_concat(self, op):
      output_shape = list(self._output_shape_cache[op.input[0]])
      axis = ConverterUtil.get_arg(op, MaceKeyword.mace_axis_str).i
      if axis < 0:
          axis = len(output_shape) + axis
      output_shape[axis] = 0
      for input_node in op.input:
          input_shape = list(self._output_shape_cache[input_node])
          output_shape[axis] = output_shape[axis] + input_shape[axis]
      self.add_output_shape(op, [output_shape])
  
imports: import math
  import numpy
  import six
  from transform.transformer import Transformer
  from transform.base_converter import DataFormat
  from transform.base_converter import MaceOp
  from transform.base_converter import MaceKeyword
  from transform.base_converter import ConverterUtil
  from utils.util import mace_check
label_desc: Use image node_id 7 for calling the ShapeInference obj's underlying member method code with example usage: obj.infer_shape_concat(op) without return types