code: def forward(self, data_batch, is_train=None):
          
          assert self.binded and self.params_initialized
  
          # make a shallow copy, just to maintain necessary properties (if any) like
          # bucket_key, pad, etc.
          data_batch = copy.copy(data_batch)
  
          for i_layer, module in enumerate(self._modules):
              module.forward(data_batch, is_train=is_train)
  
              if i_layer+1 == len(self._modules):
                  # the last layer, do not need to do the followings
                  break
  
              data_batch.data = module.get_outputs()
              if hasattr(data_batch, 'provide_data'):
                  # need to update this, in case the internal module is using bucketing
                  # or whatever
                  data_names = [x[0] for x in module.output_shapes]
                  assert len(data_names) == len(data_batch.data)
                  data_batch.provide_data = [(name, x.shape) for name, x in
                                             zip(data_names, data_batch.data)]
docs: Forward computation.
  
          Parameters
          ----------
          data_batch : DataBatch
          is_train : bool
              Default is ``None``, in which case `is_train` is take as ``self.for_training``.