docs: def _apply_conv(self, inputs, w):
      """Apply a `separable_conv2d` operation on `inputs` using `w`.
  
      Args:
        inputs: A Tensor of shape `data_format` and of type `tf.float16`,
            `tf.bfloat16` or `tf.float32`.
        w: A tuple of weight matrices of the same type as `inputs`, the first
          being the depthwise weight matrix, and the second being the pointwise
          weight matrix.
  
      Returns:
        outputs: The result of the convolution operation on `inputs`.
      """
      if self._data_format == DATA_FORMAT_NWC:
        h_dim = 1
        two_dim_conv_data_format = DATA_FORMAT_NHWC
      else:
        h_dim = 2
        two_dim_conv_data_format = DATA_FORMAT_NCHW
  
      inputs = tf.expand_dims(inputs, axis=h_dim)
      two_dim_conv_stride = self.stride[:h_dim] + (1,) + self.stride[h_dim:]
  
      # Height always precedes width.
      two_dim_conv_rate = (1,) + self._rate
  
      w_dw, w_pw = w
      outputs = tf.nn.separable_conv2d(inputs,
                                       w_dw,
                                       w_pw,
                                       strides=two_dim_conv_stride,
                                       rate=two_dim_conv_rate,
                                       padding=self._conv_op_padding,
                                       data_format=two_dim_conv_data_format)
      outputs = tf.squeeze(outputs, [h_dim])
      return outputs