class_docstr: In e-commerce system, user behavior is the carrier of latent interest, and interest will change after
  user takes one behavior. At the interest extractor layer, DIEN extracts series of interest states from
  sequential user behaviors.
code: def forward(self, keys, keys_length, neg_keys=None):
      batch_size, hist_len, embedding_size = keys.shape
      packed_keys = pack_padded_sequence(
          keys,
          lengths=keys_length.cpu(),
          batch_first=True,
          enforce_sorted=False,
      )
      packed_rnn_outputs, _ = self.gru(packed_keys)
      rnn_outputs, _ = pad_packed_sequence(
          packed_rnn_outputs,
          batch_first=True,
          padding_value=0,
          total_length=hist_len,
      )
  
      aux_loss = self.auxiliary_loss(
          rnn_outputs[:, :-1, :],
          keys[:, 1:, :],
          neg_keys[:, 1:, :],
          keys_length - 1,
      )
  
      return rnn_outputs, aux_loss
  
imports: import torch
  import torch.nn
  import torch.nn.functional
  from torch.nn.init import xavier_normal_, constant_
  from torch.nn.utils.rnn import pack_padded_sequence, pad_packed_sequence, PackedSequence
  from recbole.utils import ModelType, InputType, FeatureType
  from recbole.model.layers import FMEmbedding, MLPLayers, ContextSeqEmbLayer, SequenceAttLayer
  from recbole.model.abstract_recommender import SequentialRecommender
label_desc: Use image node_id 2 for calling the InterestExtractorNetwork obj's underlying member method code with example usage: obj.forward(keys, keys_length, neg_keys) and returns: rnn_outputs,  aux_loss