code: def conv_stride2_multistep(x, nbr_steps, output_filters, name=None, reuse=None):
    
    with tf.variable_scope(
        name, default_name="conv_stride2_multistep", values=[x], reuse=reuse):
      if nbr_steps == 0:
        out = conv(x, output_filters, (1, 1))
        return out, [out]
      hidden_layers = [x]
      for i in range(nbr_steps):
        hidden_layers.append(
            conv(
                hidden_layers[-1],
                output_filters, (2, 2),
                strides=2,
                activation=tf.nn.relu,
                name="conv" + str(i)))
      return hidden_layers[-1], hidden_layers
docs: Use a strided convolution to downsample x by 2, `nbr_steps` times.
  
    We use stride and filter size 2 to avoid the checkerboard problem of deconvs.
    As detailed in http://distill.pub/2016/deconv-checkerboard/.
  
    Args:
      x: a `Tensor` with shape `[batch, spatial, depth]` or
       `[batch, spatial_1, spatial_2, depth]`
      nbr_steps: number of halving downsample rounds to apply
      output_filters: an int specifying the filter count for the convolutions
      name: a string
      reuse: a boolean
  
    Returns:
      a `Tensor` with shape `[batch, spatial / (2**nbr_steps), output_filters]` or
       `[batch, spatial_1 / (2**nbr_steps), spatial_2 / (2**nbr_steps),
         output_filters]`