code: def forward(self, X, hidden, cells=None):
      new_hiddens = []
      new_cells = []
      if self.model_name == "lstm":
          for i in range(len(self.cells)):
              (new_hidden, new_cell) = self.cells[i](
                  X, (hidden[i], cells[i])
              )
              X = self.Dropout_layer(new_hidden)
              new_hiddens.append(new_hidden)
              new_cells.append(new_cell)
      else:
          for i in range(len(self.cells)):
              new_hidden = self.cells[i](X, hidden[i])
              X = self.Dropout_layer(new_hidden)
              new_hiddens.append(new_hidden)
      return new_hidden, new_hiddens, new_cells
  
imports: import inspect
  import warnings
  from typing import Optional, Tuple, Dict, Any
  import os
  import torch
  import torch.nn
  import torch.nn.functional
  from transformers.utils import ModelOutput
  from transformers.modeling_utils import PreTrainedModel
  from transformers.configuration_utils import PretrainedConfig
  from torch.nn import CrossEntropyLoss
  from .abstract_model import AbstractModel
label_desc: Use image node_id 2 for calling the RNNDecoder obj's underlying member method code with example usage: obj.forward(X, hidden, cells) and returns: new_hidden,  new_hiddens,  new_cells