code: def dqn_sym_nips(action_num, data=None, name='dqn'):
      
      if data is None:
          net = mx.symbol.Variable('data')
      else:
          net = data
      net = mx.symbol.Convolution(data=net, name='conv1', kernel=(8, 8), stride=(4, 4), num_filter=16)
      net = mx.symbol.Activation(data=net, name='relu1', act_type="relu")
      net = mx.symbol.Convolution(data=net, name='conv2', kernel=(4, 4), stride=(2, 2), num_filter=32)
      net = mx.symbol.Activation(data=net, name='relu2', act_type="relu")
      net = mx.symbol.Flatten(data=net)
      net = mx.symbol.FullyConnected(data=net, name='fc3', num_hidden=256)
      net = mx.symbol.Activation(data=net, name='relu3', act_type="relu")
      net = mx.symbol.FullyConnected(data=net, name='fc4', num_hidden=action_num)
      net = mx.symbol.Custom(data=net, name=name, op_type='DQNOutput')
      return net
docs: Structure of the Deep Q Network in the NIPS 2013 workshop paper:
      Playing Atari with Deep Reinforcement Learning (https://www.cs.toronto.edu/~vmnih/docs/dqn.pdf)
  
      Parameters
      ----------
      action_num : int
      data : mxnet.sym.Symbol, optional
      name : str, optional