code: def scaled_dot_product(self, query_heads, key_heads):
      key_heads_transposed = key_heads.transpose(2, 3)
      dot_product = torch.matmul(query_heads, key_heads_transposed)
      attention_weights = dot_product / np.sqrt(self.d_head)
      return attention_weights
  
imports: from collections import OrderedDict
  import os
  import numpy
  import torch
  from torch import nn
  from gluoncv.torch.utils.coot_utils import truncated_normal_fill
label_desc: Use image node_id 3 for calling the MultiHeadAttention obj's underlying member method code with example usage: obj.scaled_dot_product(query_heads, key_heads) and returns: attention_weights