class_docstr: NetVLAD module
  Args:
      cluster_size (int): cluster size
      feature_size (int): feature size
      ghost_clusters (int): ghost cluster size
      add_batch_norm (bool): add batch normalization
code: def __init__(
      self,
      cluster_size,
      feature_size,
      ghost_clusters=0,
      add_batch_norm=True,
  ):
      super().__init__()
  
      self.feature_size = feature_size
      self.cluster_size = cluster_size
      self.ghost_clusters = ghost_clusters
  
      init_sc = 1 / math.sqrt(feature_size)
      clusters = cluster_size + ghost_clusters
  
      # The `clusters` weights are the `(w,b)` in the paper
      self.clusters = nn.Parameter(
          init_sc * th.randn(feature_size, clusters)
      )
      self.batch_norm = (
          nn.BatchNorm1d(clusters) if add_batch_norm else None
      )
      # The `clusters2` weights are the visual words `c_k` in the paper
      self.clusters2 = nn.Parameter(
          init_sc * th.randn(1, feature_size, cluster_size)
      )
      self.out_dim = self.cluster_size * feature_size
  
imports: import math
  import torch.nn.functional
  import torch
  from torch import nn
label_desc: Use image node_id 1 to create a new NetVLAD object from inherited base classes: nn with example: obj = NetVLAD(cluster_size, feature_size, ghost_clusters, add_batch_norm)