class_docstr: ### Residual block
  
  A residual block has two convolution layers with group normalization.
  Each resolution is processed with two residual blocks.
class_docstr_tok: ["#","#","#","Residual","block","A","residual","block","has","two","convolution","layers","with","group","normalization",".","Each","resolution","is","processed","with","two","residual","blocks","."]
docstr: * `x` has shape `[batch_size, in_channels, height, width]`
  * `t` has shape `[batch_size, time_channels]`
code: def forward(self, x: torch.Tensor, t: torch.Tensor):
      """
      * `x` has shape `[batch_size, in_channels, height, width]`
      * `t` has shape `[batch_size, time_channels]`
      """
      # First convolution layer
      h = self.conv1(self.act1(self.norm1(x)))
      # Add time embeddings
      h += self.time_emb(self.time_act(t))[:, :, None, None]
      # Second convolution layer
      h = self.conv2(self.dropout(self.act2(self.norm2(h))))
  
      # Add the shortcut connection and return
      return h + self.shortcut(x)
  
imports: import math
  from typing import Optional, Tuple, Union, List
  import torch
  from torch import nn
  from labml_helpers.module import Module
label_desc: Use image node_id 2 for calling the ResidualBlock obj's underlying member method code with example usage: obj.forward(x, t) and returns: unknown