code: def conv_elems_1d(x, factor, out_depth=None):
    
    out_depth = out_depth or x.get_shape().as_list()[-1]
    # with tf.control_dependencies(  # Dynamic assertion
    #     [tf.assert_equal(tf.shape(x)[1] % factor, 0)]):
    x = tf.expand_dims(x, 1)  # [batch_size, 1, length, depth]
    x = layers().Conv2D(
        filters=out_depth,
        kernel_size=(1, factor),
        strides=(1, factor),
        padding="valid",
        data_format="channels_last",
    )(x)  # [batch_size, 1, length//factor, out_depth]
    x = tf.squeeze(x, 1)  # [batch_size, length//factor, depth]
    return x
docs: Decrease the length and change the dimensionality.
  
    Merge/restore/compress factors positions of dim depth of the input into
    a single position of dim out_depth.
    This is basically just a strided convolution without overlap
    between each strides. The original length has to be divided by factor.
  
    Args:
      x (tf.Tensor): shape [batch_size, length, depth]
      factor (int): Length compression factor.
      out_depth (int): Output depth
  
    Returns:
      tf.Tensor: shape [batch_size, length//factor, out_depth]