code: def test_resnet(
      img_height: int,
      img_width: int,
      first_in_channels: int,
      out_channels: int,
      resnet_size: int,
  ):
      # make repeatable
      torch.manual_seed(RANDOM_SEED)
  
      resnet = ResNet(
          img_height=img_height,
          img_width=img_width,
          first_in_channels=first_in_channels,
          out_channels=out_channels,
          resnet_size=resnet_size,
      )
      input_tensor = torch.rand(
          2, first_in_channels, img_height, img_width
      )
      output_tensor = resnet(input_tensor)
      assert output_tensor.shape[1:] == resnet.output_shape
  
      # check for parameter updates
      target = torch.randn(output_tensor.shape)
      fpc, tpc, upc, not_updated = check_module_parameters_updated(
          resnet, (input_tensor,), target
      )
      # all trainable parameters should be updated
      assert tpc == upc, (
          f"All parameter not updated. Parameters not updated: {not_updated}"
          f"\nModule structure:\n{resnet}"
      )
  
file_path: ludwig/tests/ludwig/modules/test_convolutional_modules.py
imports: from typing import Callable, Dict, List, Optional, Tuple, Union
  import pytest
  import torch
  from ludwig.modules.convolutional_modules import Conv1DLayer, Conv1DStack, Conv2DLayer, Conv2DLayerFixedPadding, Conv2DStack, ParallelConv1D, ParallelConv1DStack, ResNet, ResNetBlock, ResNetBlockLayer, ResNetBottleneckBlock
  from ludwig.utils.image_utils import get_img_output_shape
  from tests.integration_tests.parameter_update_utils import check_module_parameters_updated
label_desc: Use image node_id 12 for calling a global function with example usage: test_resnet(img_height, img_width, first_in_channels, out_channels, resnet_size) without return types