[
  {
    "name": "Conv2D",
    "schema": {
      "category": "Layer",
      "inputs": [
        { "name": "input" },
        { "name": "weights" },
        { "name": "bias" }
      ],
      "outputs": [
        { "name": "output" }
      ],
      "attributes": [
        { "name": "padding", "type": "Padding", "default": "SAME" },
        { "name": "fused_activation_function", "type": "ActivationFunctionType", "default": "NONE" },
        { "name": "stride_w", "type": "int32", "default": 1 },
        { "name": "stride_h", "type": "int32", "default": 1 },
        { "name": "dilation_w_factor", "type": "int32", "default": 1 },
        { "name": "dilation_h_factor", "type": "int32", "default": 1 }
      ]
    }
  },
  {
    "name": "LSTM",
    "schema": {
      "category": "Layer",
      "inputs": [
        { "name": "input", "type": "T", "description": "Input tensor." },
        { "name": "input_input_weights", "type": "T", "option": "optional", "description": "Input to input weights tensor.", "visible": false },
        { "name": "input_forget_weights", "type": "T", "description": "Input to forget weights tensor.", "visible": false },
        { "name": "input_cell_weights", "type": "T", "description": "Input to cell weights tensor.", "visible": false },
        { "name": "input_output_weights", "type": "T", "description": "Input to output weights tensor.", "visible": false },
        { "name": "recurrent_input_weights", "type": "T", "option": "optional", "description": "Recurrent to input weights tensor.", "visible": false },
        { "name": "recurrent_forget_weights", "type": "T", "description": "Recurrent to forget weights tensor.", "visible": false },
        { "name": "recurrent_cell_weights", "type": "T", "description": "Recurrent to cell weights tensor.", "visible": false },
        { "name": "recurrent_output_weights", "type": "T", "description": "Recurrent to output weights tensor.", "visible": false },
        { "name": "cell_input_weights", "type": "T", "option": "optional", "description": "Cell to input weights tensor.", "visible": false },
        { "name": "cell_forget_weights", "type": "T", "option": "optional", "description": "Cell to forget weights tensor.", "visible": false },
        { "name": "cell_output_weights", "type": "T", "option": "optional", "description": "Cell to output weights tensor.", "visible": false },
        { "name": "input_bias", "type": "T", "option": "optional", "description": "Input gate bias tensor.", "visible": false },
        { "name": "forget_bias", "type": "T", "description": "Forget gate bias tensor.", "visible": false },
        { "name": "cell_bias", "type": "T", "description": "Cell gate bias tensor.", "visible": false },
        { "name": "output_bias", "type": "T", "description": "Output gate bias tensor.", "visible": false },
        { "name": "projection_weights", "type": "T", "option": "optional", "description": "Projection weights tensor.", "visible": false },
        { "name": "projection_bias", "type": "T", "option": "optional", "description": "Projection bias tensor.", "visible": false }
      ],
      "outputs": [
        { "name": "scratch", "type": "T" },
        { "name": "output_state", "type": "T" },
        { "name": "cell_state", "type": "T" },
        { "name": "output", "type": "T" }
      ],
      "attributes": [
        { "name": "fused_activation_function", "type": "ActivationFunctionType", "default": "NONE" },
        { "name": "cell_clip", "type": "float32", "default": 0.0 },
        { "name": "proj_clip", "type": "float32", "default": 0.0 },
        { "name": "kernel_type", "type": "LSTMKernelType", "default": "FULL" }
      ]
    }
  },
  {
    "name": "RNN",
    "schema": {
      "category": "Layer",
      "inputs": [
        { "name": "X", "type": "T" },
        { "name": "W", "type": "T" },
        { "name": "R", "type": "T" },
        { "name": "b", "type": "T" }
      ],
      "outputs": [
        { "name": "hidden", "type": "T" },
        { "name": "output", "type": "T" }
      ],
      "attributes": [
        { "name": "fused_activation_function", "type": "ActivationFunctionType", "default": "NONE" }
      ]
    }
  },
  {
    "name": "FullyConnected",
    "schema": {
      "category": "Layer",
      "inputs": [
        { "name": "input", "type": "T" },
        { "name": "weights", "type": "T" },
        { "name": "bias", "type": "T" }
      ],
      "outputs": [
        { "name": "output", "type": "T" }
      ],
      "attributes": [
        { "name": "fused_activation_function", "type": "ActivationFunctionType", "default": "NONE" },
        { "name": "weights_format", "type": "FullyConnectedOptionsWeightsFormat", "default": "DEFAULT" },
        { "name": "keep_num_dims", "type": "boolean" }
      ]
    }
  },
  {
    "name": "DepthwiseConv2D",
    "schema": {
      "category": "Layer",
      "inputs": [
        { "name": "input", "type": "T" },
        { "name": "weights", "type": "T" },
        { "name": "bias", "type": "T" }
      ],
      "outputs": [
        { "name": "output", "type": "T" }
      ],
      "attributes": [
        { "name": "padding", "type": "Padding", "default": "SAME" },
        { "name": "fused_activation_function", "type": "ActivationFunctionType", "default": "NONE" },
        { "name": "stride_w", "type": "int32", "default": 1 },
        { "name": "stride_h", "type": "int32", "default": 1 },
        { "name": "depth_multiplier", "type": "int32", "default": 1 },
        { "name": "dilation_w_factor", "type": "int32", "default": 1 },
        { "name": "dilation_h_factor", "type": "int32", "default": 1 }
      ]
    }
  },
  {
    "name": "AveragePool2D",
    "schema": {
      "category": "Pool",
      "inputs": [
        { "name": "input", "type": "T" }
      ],
      "outputs": [
        { "name": "output", "type": "T" }
      ],
      "attributes": [
        { "name": "padding", "type": "Padding", "default": "SAME" },
        { "name": "fused_activation_function", "type": "ActivationFunctionType", "default": "NONE" },
        { "name": "stride_w", "type": "int32" },
        { "name": "stride_h", "type": "int32" },
        { "name": "filter_width", "type": "int32" },
        { "name": "filter_height", "type": "int32" }
      ]
    }
  },
  {
    "name": "Softmax",
    "schema": {
      "category": "Activation",
      "inputs": [
        { "name": "input", "type": "T" }
      ],
      "outputs": [
        { "name": "output", "type": "T" }
      ]
    }
  },
  {
    "name": "LogSoftmax",
    "schema": {
      "category": "Activation",
      "inputs": [
        { "name": "input", "type": "T" }
      ],
      "outputs": [
        { "name": "output", "type": "T" }
      ]
    }
  },
  {
    "name": "Relu",
    "schema": {
      "category": "Activation",
      "inputs": [
        { "name": "input", "type": "T" }
      ],
      "outputs": [
        { "name": "output", "type": "T" }
      ]
    }
  },
  {
    "name": "Relu6",
    "schema": {
      "category": "Activation",
      "inputs": [
        { "name": "input", "type": "T" }
      ],
      "outputs": [
        { "name": "output", "type": "T" }
      ]
    }
  },
  {
    "name": "Prelu",
    "schema": {
      "category": "Activation",
      "inputs": [
        { "name": "input", "type": "T" },
        { "name": "slope", "type": "T" }
      ],
      "outputs": [
        { "name": "output", "type": "T" }
      ]
    }
  },
  {
    "name": "Tanh",
    "schema": {
      "category": "Activation",
      "inputs": [
        { "name": "input", "type": "T" }
      ],
      "outputs": [
        { "name": "output", "type": "T" }
      ]
    }
  },
  {
    "name": "Reshape",
    "schema": {
      "category": "Shape",
      "attributes": [
        { "name": "new_shape", "type": "shape"}
      ],
      "inputs": [
        { "name": "data", "type": "T" },
        { "name": "shape", "type": "T" }
      ],
      "outputs": [
        { "name": "reshaped", "type": "T" }
      ]
    }
  },
  {
    "name": "MaxPool2D",
    "schema": {
      "category": "Pool",
      "inputs": [
        { "name": "input", "type": "T" }
      ],
      "outputs": [
        { "name": "output", "type": "T" }
      ],
      "attributes": [
        { "name": "padding", "type": "Padding", "default": "SAME" },
        { "name": "fused_activation_function", "type": "ActivationFunctionType", "default": "NONE" },
        { "name": "stride_w", "type": "int32" },
        { "name": "stride_h", "type": "int32" },
        { "name": "filter_width", "type": "int32" },
        { "name": "filter_height", "type": "int32" }
      ]
    }
  },
  {
    "name": "LSHProjection",
    "schema": {
      "inputs": [
        { "name": "hash" },
        { "name": "input" },
        { "name": "weight" }
      ],
      "outputs": [
        { "name": "output" }
      ],
      "attributes": [
        { "name": "type", "type": "LSHProjectionType" }
      ]
    }
  },
  {
    "name": "Normalize",
    "schema": {
      "category": "Normalization",
      "inputs": [
        { "name": "input" }
      ],
      "outputs": [
        { "name": "output" }
      ]
    }
  },
  {
    "name": "LocalResponseNormalization",
    "schema": {
      "category": "Normalization",
      "attributes": [
        { "name": "radius", "type": "int32", "default": 5 },
        { "name": "bias", "type": "float32", "default": 1 },
        { "name": "alpha", "type": "float32", "default": 1 },
        { "name": "beta", "type": "float32", "default": 0.5 }
      ],
      "inputs": [
        { "name": "input" }
      ],
      "outputs": [
        { "name": "output" }
      ]
    }
  },
  {
    "name": "Predict",
    "schema": {
      "inputs": [
        { "name": "hashes" },
        { "name": "keys" },
        { "name": "labels" },
        { "name": "weights" }
      ],
      "outputs": [
        { "name": "label" },
        { "name": "weight" }
      ]
    }
  },
  {
    "name": "HashtableLookup",
    "schema": {
      "inputs": [
        { "name": "key" },
        { "name": "keys" },
        { "name": "values" }
      ],
      "outputs": [
        { "name": "value" },
        { "name": "hits" }
      ]
    }
  },
  {
    "name": "ExtractFeatures",
    "schema": {
      "inputs": [
        { "name": "ngrams" }
      ],
      "outputs": [
        { "name": "features" },
        { "name": "weights" }
      ]
    }
  },
  {
    "name": "SkipGram",
    "schema": {
      "inputs": [
        { "name": "inputs" }
      ],
      "outputs": [
        { "name": "ngrams" }
      ]
    }
  },
  {
    "name": "Concatenation",
    "schema": {
      "category": "Tensor",
      "inputs": [
        { "name": "inputs", "option": "variadic" }
      ],
      "outputs": [
        { "name": "output" }
      ],
      "attributes": [
        { "name": "axis", "type": "int32" },
        { "name": "fused_activation_function", "type": "ActivationFunctionType", "default": "NONE" }
      ]
    }
  },
  {
    "name": "Pad",
    "schema": {
      "category": "Tensor",
      "inputs": [
        { "name": "input" },
        { "name": "paddings" }
      ],
      "outputs": [
        { "name": "output" }
      ]
    }
  },
  {
    "name": "Split",
    "schema": {
      "category": "Tensor",
      "inputs": [
        { "name": "axis" },
        { "name": "input" }
      ],
      "outputs": [
        { "name": "output" }
      ]
    }
  },
  {
    "name": "Squeeze",
    "schema": {
      "category": "Transform",
      "inputs": [
        { "name": "input" }
      ],
      "outputs": [
        { "name": "output" }
      ]
    }
  },
  {
    "name": "StridedSlice",
    "schema": {
      "category": "Tensor",
      "inputs": [
        { "name": "input" },
        { "name": "begin" },
        { "name": "end" },
        { "name": "strides" }
      ],
      "outputs": [
        { "name": "output" }
      ]
    }
  },
  {
    "name": "SVDF",
    "schema": {
      "category": "Layer",
      "inputs": [
        { "name": "input", "type": "T" },
        { "name": "feature", "type": "T" },
        { "name": "time", "type": "T" },
        { "name": "bias", "type": "T" }
      ],
      "outputs": [
        { "name": "state", "type": "T" },
        { "name": "output", "type": "T" }
      ],
      "attributes": [
        { "name": "fused_activation_function", "type": "ActivationFunctionType", "default": "NONE" }
      ]
    }
  },
  {
    "name": "Add",
    "schema": {
      "inputs": [
        { "name": "A", "type": "T" },
        { "name": "B", "type": "T" }
      ],
      "outputs": [
        { "name": "C", "type": "T" }
      ],
      "attributes": [
        { "name": "fused_activation_function", "type": "ActivationFunctionType", "default": "NONE" }
      ]
    }
  },
  {
    "name": "Sub",
    "schema": {
      "inputs": [
        { "name": "A", "type": "T" },
        { "name": "B", "type": "T" }
      ],
      "outputs": [
        { "name": "C", "type": "T" }
      ],
      "attributes": [
        { "name": "fused_activation_function", "type": "ActivationFunctionType", "default": "NONE" }
      ]
    }
  },
  {
    "name": "Mul",
    "schema": {
      "inputs": [
        { "name": "A", "type": "T" },
        { "name": "B", "type": "T" }
      ],
      "outputs": [
        { "name": "C", "type": "T" }
      ],
      "attributes": [
        { "name": "fused_activation_function", "type": "ActivationFunctionType", "default": "NONE" }
      ]
    }
  },
  {
    "name": "Sum",
    "schema": {
      "inputs": [
        { "name": "input", "type": "T" },
        { "name": "axis", "type": "T" }
      ],
      "outputs": [
        { "name": "output", "type": "T" }
      ],
      "attributes": [
        { "name": "keep_dims", "type": "boolean" }
      ]
    }
  },
  {
    "name": "ReduceMax",
    "schema": {
      "inputs": [
        { "name": "input", "type": "T" },
        { "name": "axis", "type": "T" }
      ],
      "outputs": [
        { "name": "output", "type": "T" }
      ],
      "attributes": [
        { "name": "keep_dims", "type": "boolean" }
      ]
    }
  },
  {
    "name": "ReduceMin",
    "schema": {
      "inputs": [
        { "name": "input", "type": "T" },
        { "name": "axis", "type": "T" }
      ],
      "outputs": [
        { "name": "output", "type": "T" }
      ],
      "attributes": [
        { "name": "keep_dims", "type": "boolean" }
      ]
    }
  },
  {
    "name": "Mean",
    "schema": {
      "inputs": [
        { "name": "input", "type": "T" },
        { "name": "axis", "type": "T" }
      ],
      "outputs": [
        { "name": "output", "type": "T" }
      ],
      "attributes": [
        { "name": "keep_dims", "type": "boolean" }
      ]
    }
  },
  {
    "name": "Logistic",
    "schema": {
      "inputs": [
        { "name": "input" }
      ],
      "outputs": [
        { "name": "output" }
      ]
    }
  },
  {
    "name": "ResizeBilinear",
    "schema": {
      "attributes": [
        { "name": "align_corners", "default": false }
      ],
      "inputs": [
        { "name": "input" },
        { "name": "size" }
      ],
      "outputs": [
        { "name": "output" }
      ]
    }
  },
  {
    "name": "Gather",
    "schema": {
      "attributes": [
        { "name": "axis", "default": 0 }
      ],
      "inputs": [
        { "name": "input" },
        { "name": "positions" }
      ],
      "outputs": [
        { "name": "output" }
      ]
    }
  },
  {
    "name": "Cast",
    "schema": {
      "attributes": [
        { "name": "in_data_type", "type": "TensorType" },
        { "name": "out_data_type", "type": "TensorType" }
      ],
      "inputs": [
        { "name": "input" }
      ],
      "outputs": [
        { "name": "output" }
      ]
    }
  },
  {
    "name": "ArgMax",
    "schema": {
      "attributes": [
        { "name": "output_type", "type": "TensorType" }
      ]
    }
  },
  {
    "name": "ArgMin",
    "schema": {
      "attributes": [
        { "name": "output_type", "type": "TensorType" }
      ]
    }
  },
  {
    "name": "TransposeConv",
    "schema": {
      "attributes": [
        { "name": "padding", "type": "Padding" },
        { "name": "stride_w", "type": "int32" },
        { "name": "stride_h", "type": "int32" }
      ]
    }
  },
  {
    "name": "Shape",
    "schema": {
      "attributes": [
        { "name": "out_type", "type": "TensorType" }
      ]
    }
  },
  {
    "name": "Unique",
    "schema": {
      "attributes": [
        { "name": "idx_out_type", "type": "TensorType", "default": "int32" }
      ]
    }
  },
  {
    "name": "Slice",
    "schema": {
      "category": "Tensor",
      "inputs": [
        { "name": "input" },
        { "name": "begin" },
        { "name": "size" }
      ],
      "outputs": [
        { "name": "output" }
      ]
    }
  },
  {
    "name": "Transpose",
    "schema": {
      "category": "Transform",
      "inputs": [
        { "name": "input" },
        { "name": "perm" }
      ],
      "outputs": [
        { "name": "output" }
      ]
    }
  },
  {
    "name": "Quantize",
    "schema": {
      "inputs": [
        { "name": "input" }
      ],
      "outputs": [
        { "name": "output" }
      ]
    }
  },
  {
    "name": "Dequantize",
    "schema": {
      "inputs": [
        { "name": "input" }
      ],
      "outputs": [
        { "name": "output" }
      ]
    }
  },
  {
    "name": "Minimum",
    "schema": {
      "inputs": [
        { "name": "input1" },
        { "name": "input2" }
      ],
      "outputs": [
        { "name": "output" }
      ]
    }
  },
  {
    "name": "Maximum",
    "schema": {
      "inputs": [
        { "name": "input1" },
        { "name": "input2" }
      ],
      "outputs": [
        { "name": "output" }
      ]
    }
  }
]
