class_docstr: visual feature branch
class_docstr_tok: ["visual","feature","branch"]
code: def forward(self, edges):
      feat = nd.concat(
          edges.src["node_feat"],
          edges.dst["node_feat"],
          edges.data["edge_feat"],
      )
      out_joint = self.mlp_joint(feat)
      out_sub = self.mlp_sub(edges.src["node_feat"])
      out_ob = self.mlp_ob(edges.dst["node_feat"])
      out = out_joint + out_sub + out_ob
      return {"visual": out}
  
imports: import pickle
  import dgl
  import gluoncv
  import mxnet
  import numpy
  from dgl.nn.mxnet import GraphConv
  from dgl.utils import toindex
  from mxnet import nd
  from mxnet.gluon import nn
label_desc: Use image node_id 2 for calling the EdgeVisual obj's underlying member method code with example usage: obj.forward(edges) and returns: dict