docstr: Args:
      source: tensor of shape (D1, D2, ..., DN, C, H, W)
      target: tensor of shape (D1, D2, ..., DN, C, H, W)
  
  Returns:
      psnr loss of shape (D1, D2, ..., DN)
code: def forward(self, source: Tensor, target: Tensor) -> Tensor:
      """
      Args:
          source: tensor of shape (D1, D2, ..., DN, C, H, W)
          target: tensor of shape (D1, D2, ..., DN, C, H, W)
  
      Returns:
          psnr loss of shape (D1, D2, ..., DN)
      """
  
      # multiply by -1 as we want to maximize the psnr
      return -1 * _psnr_loss_fn(source, target, self.max_val)
  
imports: from typing import List, Optional
  import torch
  from torch import nn, Tensor
  from torch.nn import functional
  from torchvision.prototype.models.depth.stereo.raft_stereo import grid_sample, make_coords_grid
label_desc: Use image node_id 2 for calling the PSNRLoss obj's underlying member method code with example usage: obj.forward(source, target) and returns: unknown