code: def forward(self, inputs):
      # Concatenate the output of two embedding layers with shape of
      # (batch size, number of words, word vector dimension) by word vector
      embeddings = mx.np.concatenate(
          [self.embedding(inputs), self.constant_embedding(inputs)],
          axis=2,
      )
      # According to the input format required by Conv1D, the word vector
      # dimension, that is, the channel dimension of the one-dimensional
      # convolutional layer, is transformed into the previous dimension
      embeddings = embeddings.transpose((0, 2, 1))
      # For each one-dimensional convolutional layer, after max-over-time
      # pooling, an NDArray with the shape of (batch size, channel size, 1)
      # can be obtained. Use the flatten function to remove the last
      # dimension and then concatenate on the channel dimension
      encoding = mx.np.concatenate(
          [
              mx.npx.batch_flatten(self.pool(conv(embeddings)))
              for conv in self.convs
          ],
          axis=1,
      )
      # After applying the dropout method, use a fully connected layer to
      # obtain the output
      outputs = self.decoder(self.dropout(encoding))
      return outputs
  
imports: import collections
  import os
  import random
  import sys
  import tarfile
  import mxnet
  from mxnet import nd, gluon
  from mxnet.contrib import text
  from mxnet.gluon import nn, rnn
  from mxnet.gluon.contrib.estimator import estimator
  import pytest
label_desc: Use image node_id 2 for calling the TextCNN obj's underlying member method code with example usage: obj.forward(inputs) and returns: outputs