.. Licensed to the Apache Software Foundation (ASF) under one
   or more contributor license agreements.  See the NOTICE file
   distributed with this work for additional information
   regarding copyright ownership.  The ASF licenses this file
   to you under the Apache License, Version 2.0 (the
   "License"); you may not use this file except in compliance
   with the License.  You may obtain a copy of the License at

     http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing,
   software distributed under the License is distributed on an
   "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
   KIND, either express or implied.  See the License for the
   specific language governing permissions and limitations
   under the License.

mxnet.contrib
=============

.. automodule:: mxnet.contrib

Contributed modules
-------------------

.. container:: cards

   .. card::
      :title: contrib.io
      :link: io/index.html

      Data iterators for common data formats and utility functions.

   .. card::
      :title: contrib.ndarray
      :link: ndarray/index.html

      Operations and functions on NDArrays.

   .. card::
      :title: contrib.onnx
      :link: onnx/index.html

      ONNX support.

   .. card::
      :title: contrib.symbol
      :link: symbol/index.html

      Symbolic API for MXNet.

   .. card::
      :title: contrib.tensorboard
      :link: tensorboard/index.html

      Tensorboard integration.

   .. card::
      :title: contrib.tensorrt
      :link: tensorrt/index.html

      Tensorrt integration.

   .. card::
      :title: contrib.text
      :link: text/index.html

      Functions for manipulating text data.

   .. card::
      :title: contrib.quantization
      :link: quantization/index.html

      Functions for precision reduction.

.. toctree::
   :hidden:
   :maxdepth: 2
   :glob:

   */index
