[
  {
    "name": "Conv2D",
    "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" },
        { "name": "stride_w", "type": "int" },
        { "name": "stride_h", "type": "int" },
        { "name": "fused_activation_function", "type": "ActivationFunctionType" }
      ]
    }
  },
  {
    "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.", "hidden": true },
        { "name": "input_forget_weights", "type": "T", "description": "Input to forget weights tensor.", "hidden": true },
        { "name": "input_cell_weights", "type": "T", "description": "Input to cell weights tensor.", "hidden": true },
        { "name": "input_output_weights", "type": "T", "description": "Input to output weights tensor.", "hidden": true },
        { "name": "recurrent_input_weights", "type": "T", "option": "optional", "description": "Recurrent to input weights tensor.", "hidden": true },
        { "name": "recurrent_forget_weights", "type": "T", "description": "Recurrent to forget weights tensor.", "hidden": true },
        { "name": "recurrent_cell_weights", "type": "T", "description": "Recurrent to cell weights tensor.", "hidden": true },
        { "name": "recurrent_output_weights", "type": "T", "description": "Recurrent to output weights tensor.", "hidden": true },
        { "name": "cell_input_weights", "type": "T", "option": "optional", "description": "Cell to input weights tensor.", "hidden": true },
        { "name": "cell_forget_weights", "type": "T", "option": "optional", "description": "Cell to forget weights tensor.", "hidden": true },
        { "name": "cell_output_weights", "type": "T", "option": "optional", "description": "Cell to output weights tensor.", "hidden": true },
        { "name": "input_bias", "type": "T", "option": "optional", "description": "Input gate bias tensor.", "hidden": true },
        { "name": "forget_bias", "type": "T", "description": "Forget gate bias tensor.", "hidden": true },
        { "name": "cell_bias", "type": "T", "description": "Cell gate bias tensor.", "hidden": true },
        { "name": "output_bias", "type": "T", "description": "Output gate bias tensor.", "hidden": true },
        { "name": "projection_weights", "type": "T", "option": "optional", "description": "Projection weights tensor.", "hidden": true },
        { "name": "projection_bias", "type": "T", "option": "optional", "description": "Projection bias tensor.", "hidden": true }
      ],
      "outputs": [
        { "name": "scratch", "type": "T" },
        { "name": "output_state", "type": "T" },
        { "name": "cell_state", "type": "T" },
        { "name": "output", "type": "T" }
      ]
    }
  },
  {
    "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" }
      ]
    }
  },
  {
    "name": "FullyConnected",
    "schema": {
      "category": "Layer",
      "inputs": [
        { "name": "input", "type": "T" },
        { "name": "weights", "type": "T" },
        { "name": "bias", "type": "T" }
      ],
      "outputs": [
        { "name": "output", "type": "T" }
      ]
    }
  },
  {
    "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" },
        { "name": "stride_w", "type": "int" },
        { "name": "stride_h", "type": "int" },
        { "name": "depth_multiplier", "type": "int" },
        { "name": "fused_activation_function", "type": "ActivationFunctionType" }
      ]
    }
  },
  {
    "name": "AveragePool2D",
    "schema": {
      "category": "Pool",
      "inputs": [
        { "name": "input", "type": "T" }
      ],
      "outputs": [
        { "name": "output", "type": "T" }
      ]
    }
  },
  {
    "name": "Softmax",
    "schema": {
      "category": "Activation",
      "inputs": [
        { "name": "input", "type": "T" }
      ],
      "outputs": [
        { "name": "output", "type": "T" }
      ]
    }
  },
  {
    "name": "Reshape",
    "schema": {
      "category": "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" }
      ]
    }
  },
  {
    "name": "LSHProjection",
    "schema": {
      "inputs": [
        { "name": "hash" },
        { "name": "input" },
        { "name": "weight" }
      ],
      "outputs": [
        { "name": "output" }
      ]
    }
  },
  {
    "name": "Normalize",
    "schema": {
      "category": "Normalization",
      "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": "int" },
        { "name": "fused_activation_function", "type": "ActivationFunctionType" }
      ]
    }
  },
  {
    "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" }
      ]
    }
  }
]
