code: def forward(self, blocks, x):
      h = x
      for l, (layer, block) in enumerate(zip(self.layers, blocks)):
          h = layer(block, h)
          # One thing is that h might return tensors with zero rows if the number of dst nodes
          # of one node type is 0.  x.view(x.shape[0], -1) wouldn't work in this case.
          h = apply_each(
              h, lambda x: x.view(x.shape[0], x.shape[1] * x.shape[2])
          )
          if l != len(self.layers) - 1:
              h = apply_each(h, F.relu)
              h = apply_each(h, self.dropout)
      return self.linear(h["paper"])
  
file_path: dgl/examples/pytorch/rgat/train.py
imports: import dgl
  import dgl.function
  import dgl.nn
  import torch
  import torch.nn
  import torch.nn.functional
  import torchmetrics.functional
  import tqdm
  from dgl import apply_each
  from dgl.dataloading import DataLoader, NeighborSampler
  from ogb.nodeproppred import DglNodePropPredDataset
label_desc: Use image node_id 2 for calling the HeteroGAT obj's underlying member method code with example usage: obj.forward(blocks, x) and returns: self