class_docstr: Same as nn.BatchNorm1d is input has shape (batch_size, feat_dim).
  But if input has shape (batch_size, num_candidates, item_feats), like in LearnedVM,
  we transpose it, since that's what nn.BatchNorm1d computes Batch Normalization over
  1st dimension, while we want to compute it over item_feats.
  
  NOTE: this is different from nn.BatchNorm2d which is for CNNs, and expects 4D inputs
code: def forward(self, x: torch.Tensor):
      input = transpose_tensor(x, x)
      output = self.vanilla(input)
      return transpose_tensor(x, output)
  
imports: import logging
  import math
  from typing import List, Optional
  import torch
  import torch.nn
  import torch.nn.init
  from reagent.core import types
  from reagent.models.base import ModelBase
  from reagent.models.residual_wrapper import ResidualWrapper
label_desc: Use image node_id 2 for calling the SlateBatchNorm1d obj's underlying member method code with example usage: obj.forward(x) and returns: transpose_tensor