class_docstr: A point head multi-layer perceptron which we model with conv1d layers with kernel 1. The head
  takes both fine-grained features and instance-wise MLP parameters as its input.
class_docstr_tok: ["A","point","head","multi-layer","perceptron","which","we","model","with","conv1d","layers","with","kernel","1",".","The","head","takes","both","fine-grained","features","and","instance-wise","MLP","parameters","as","its","input","."]
code: def _dynamic_mlp(features, weights, biases, num_instances):
      assert features.dim() == 3, features.dim()
      n_layers = len(weights)
      x = features
      for i, (w, b) in enumerate(zip(weights, biases)):
          x = torch.einsum("nck,ndc->ndk", x, w) + b
          if i < n_layers - 1:
              x = F.relu(x)
      return x
  
file_path: detectron2/projects/PointRend/point_rend/point_head.py
imports: import numpy
  import fvcore.nn.weight_init
  import torch
  from torch import nn
  from torch.nn import functional
  from detectron2.layers import ShapeSpec, cat
  from detectron2.utils.events import get_event_storage
  from detectron2.utils.registry import Registry
label_desc: Use image node_id 3 for calling the ImplicitPointHead obj's underlying member method code with example usage: obj._dynamic_mlp(features, weights, biases, num_instances) and returns: x