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

Getting Started
===============

The following tutorials teach how to use MXNet.

.. container:: cards

   .. card::
      :title: A 60-minute Gluon crash course
      :link: crash-course/index.html

      A quick overview of the core concepts of MXNet using the Gluon API.

   .. card::
      :title: Moving from other frameworks
      :link: to-mxnet/index.html

      Guides that ease your transition to MXNet from other framework.

   .. card::
      :title: Logistic Regression Explained
      :link: logistic_regression_explained.html

      Logistic Regression with MXNet Gluon Explained

   .. card::
      :title: MNIST Training
      :link: https://mxnet.apache.org/api/python/docs/tutorials/packages/gluon/image/mnist.html

      MNIST Training with MXNet

   .. card::
      :title: Gluon From Experiment To Deployment
      :link: gluon_from_experiment_to_deployment.html

      A tutorial on implementing linear regression using MXNet APIs.

   .. card::
      :title: Gluon2.0: Migration Guide
      :link: gluon_migration_guide.html

      Migrate from MXNet v1.x to v2.x.

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

   crash-course/index
   to-mxnet/index
   gluon_from_experiment_to_deployment
   gluon_migration_guide
   logistic_regression_explained.md
   MNIST <https://mxnet.apache.org/api/python/docs/tutorials/packages/gluon/image/mnist.html>

