code: def test_conv_unknown_input_width_and_height(self):
      network = layers.join(
          layers.Input((None, None, 3)),
          layers.Convolution((3, 3, 5)),
      )
      self.assertShapesEqual(
          network.output_shape, (None, None, None, 5)
      )
  
      input_value = asfloat(np.ones((1, 12, 12, 3)))
      actual_output = self.eval(network.output(input_value))
      self.assertEqual(actual_output.shape, (1, 10, 10, 5))
  
      input_value = asfloat(np.ones((1, 21, 21, 3)))
      actual_output = self.eval(network.output(input_value))
      self.assertEqual(actual_output.shape, (1, 19, 19, 5))
  
imports: import random
  from itertools import product
  from collections import namedtuple
  import numpy
  import tensorflow
  from neupy import layers
  from neupy.utils import asfloat, shape_to_tuple
  from neupy.layers.convolutions import conv_output_shape, deconv_output_shape
  from neupy.exceptions import LayerConnectionError
  from base import BaseTestCase
label_desc: Use image node_id 16 for calling the ConvLayersTestCase obj's underlying member method code with example usage: obj.test_conv_unknown_input_width_and_height() without return types