docstr: pro_features: (1,  N * nr_boxes, self.d_model)
  roi_features: (49, N * nr_boxes, self.d_model)
docstr_tok: ["pro_features",":","(","1",",","N","*","nr_boxes",",","self.d_model",")","roi_features",":","(","49",",","N","*","nr_boxes",",","self.d_model",")"]
code: def forward(self, pro_features, roi_features):
      """
      pro_features: (1,  N * nr_boxes, self.d_model)
      roi_features: (49, N * nr_boxes, self.d_model)
      """
      features = roi_features.transpose(perm=[1, 0, 2])
      parameters = self.dynamic_layer(pro_features).transpose(
          perm=[1, 0, 2]
      )
  
      param1 = parameters[:, :, : self.num_params].reshape(
          [-1, self.hidden_dim, self.dim_dynamic]
      )
      param2 = parameters[:, :, self.num_params :].reshape(
          [-1, self.dim_dynamic, self.hidden_dim]
      )
  
      features = paddle.bmm(features, param1)
      features = self.norm1(features)
      features = self.activation(features)
  
      features = paddle.bmm(features, param2)
      features = self.norm2(features)
      features = self.activation(features)
  
      features = features.flatten(1)
      features = self.out_layer(features)
      features = self.norm3(features)
      features = self.activation(features)
  
      return features
  
imports: from __future__ import absolute_import
  from __future__ import division
  from __future__ import print_function
  import math
  import copy
  import paddle
  import paddle.nn
  from ppdet.core.workspace import register
  from ppdet.modeling.heads.roi_extractor import RoIAlign
  from ppdet.modeling.bbox_utils import delta2bbox
  from ..None import initializer
label_desc: Use image node_id 2 for calling the DynamicConv obj's underlying member method code with example usage: obj.forward(pro_features, roi_features) and returns: features