text: # 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.
  
  # pylint: disable=missing-docstring
  from __future__ import print_function
  
  import logging
  
  import mxnet as mx
  from random_data import DataIterSoftmax
  
  
  def get_net(num_labels):
      data = mx.sym.Variable('data')
      label = mx.sym.Variable('label')
      pred = mx.sym.FullyConnected(data=data, num_hidden=100)
      pred = mx.sym.FullyConnected(data=pred, num_hidden=num_labels)
      sm = mx.sym.SoftmaxOutput(data=pred, label=label)
      return sm
  
  
  if __name__ == '__main__':
      head = '%(asctime)-15s %(message)s'
      logging.basicConfig(level=logging.DEBUG, format=head)
  
      batch_size = 128
      vocab_size = 10000
      feature_size = 100
      num_label = 6
  
      data_train = DataIterSoftmax(100000, batch_size, vocab_size, num_label, feature_size)
      data_test = DataIterSoftmax(1000, batch_size, vocab_size, num_label, feature_size)
  
      network = get_net(vocab_size)
  
      model = mx.mod.Module(
          symbol=network,
          data_names=[x[0] for x in data_train.provide_data],
          label_names=[y[0] for y in data_train.provide_label],
          context=[mx.cpu()]
      )
  
      model.fit(
          train_data=data_train,
          eval_data=data_test,
          num_epoch=20,
          optimizer='sgd',
          optimizer_params={'learning_rate': 0.03, 'momentum': 0.9, 'wd': 0.0000},
          initializer=mx.init.Xavier(factor_type='in', magnitude=2.34),
          batch_end_callback=mx.callback.Speedometer(batch_size, 50)
      )
  