.. 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.

Packages
========

The documents in this unit dive into the details how each MXNet module works.

High Level APIs
---------------

.. container:: cards

   .. card::
      :title: Gluon
      :link: gluon/index.html

      MXNet's imperative interface for Python. If you're new to MXNet, start here!


Shared APIs
-----------

.. container:: cards

   .. card::
      :title: NP API
      :link: np/index.html

      Hints on MXNet NP and NPX modules, an array library that provides NumPy-compatible interfaces.

   .. card::
      :title: Autograd API
      :link: autograd/index.html

      How to use Automatic Differentiation with the Autograd API.

   .. card::
      :title: Learning Rate
      :link: gluon/training/learning_rates/learning_rate_schedules.html

      How to use the Learning Rate Scheduler.

   .. card::
      :title: KVStore API
      :link: kvstore/index.html

      How to use the KVStore API for distributed training.

   .. card::
      :title: Data APIs
      :link: gluon/data/index.html

      How to use MXNet's data APIs.

   .. card::
      :title: Visualizations
      :link: viz/index.html

      How to use MXNet's visualization features.

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

      How to use Open Neural Network Exchange (ONNX) with MXNet.

   .. card::
      :title: Optimizer
      :link: optimizer/index.html

      How to use the optimizers.

   .. card::
      :title: Legacy
      :link: legacy/index.html

      Legacy modules from MXNet 1.x.

.. toctree::
   :hidden:
   :glob:

   */index*
