'Forward computation.
Parameters
data_batch : DataBatch
is_train : bool
Default is ``None``, in which case `is_train` is take as ``self.for_training``.'

def forward(self, data_batch, is_train=None):

    assert (self.binded and self.params_initialized)
    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)):
            break
        data_batch.data = module.get_outputs()
        if hasattr(data_batch, 'provide_data'):
            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)]
