code: def _test_atrous_convolution(
      self,
      add_check,
      input_shape,
      filter_shape,
      dilation_rate,
      **kwargs,
  ):
      filters = np.arange(
          np.prod(filter_shape), dtype=np.float32
      ).reshape(filter_shape)
      filters_upsampled = upsample_filters(filters, dilation_rate)
      x = np.arange(np.prod(input_shape), dtype=np.float32).reshape(
          input_shape
      )
      y1 = nn_ops.convolution(
          input=x, filter=filters, dilation_rate=dilation_rate, **kwargs
      )
      y2 = nn_ops.convolution(
          input=x, filter=filters_upsampled, **kwargs
      )
  
      def check(y1_eval, y2_eval):
          self.assertAllClose(y1_eval, y2_eval, rtol=1e-2, atol=1e-2)
  
      add_check(check, y1, y2)
  
imports: import contextlib
  import numpy
  from tensorflow.python.eager import context
  from tensorflow.python.framework import constant_op
  from tensorflow.python.framework import dtypes
  from tensorflow.python.framework import test_util
  from tensorflow.python.ops import array_ops
  from tensorflow.python.ops import gradient_checker
  from tensorflow.python.ops import nn_ops
  import tensorflow.python.ops.nn_grad
  from tensorflow.python.platform import test
label_desc: Use image node_id 2 for calling the AtrousConvolutionTest obj's underlying member method code with example usage: obj._test_atrous_convolution(add_check, input_shape, filter_shape, dilation_rate) without return types