function separableConv2d_(x, depthwiseFilter, pointwiseFilter, strides, pad, dilation = [
    1,
    1
], dataFormat = "NHWC") {
    const $x = (0, _tensorUtilEnv.convertToTensor)(x, "x", "separableConv2d");
    const $depthwiseFilter = (0, _tensorUtilEnv.convertToTensor)(depthwiseFilter, "depthwiseFilter", "separableConv2d");
    const $pointwiseFilter = (0, _tensorUtilEnv.convertToTensor)(pointwiseFilter, "pointwiseFilter", "separableConv2d");
    let x4D = $x;
    let reshapedTo4D = false;
    if ($x.rank === 3) {
        reshapedTo4D = true;
        x4D = (0, _reshape.reshape)($x, [
            1,
            $x.shape[0],
            $x.shape[1],
            $x.shape[2]
        ]);
    }
    if (dataFormat === "NCHW") throw new Error("separableConv2d currently does not support dataFormat NCHW; only NHWC is supported");
    _util.assert(x4D.rank === 4, ()=>`Error in separableConv2d: input must be rank 4, but got ` + `rank ${x4D.rank}.`);
    _util.assert($depthwiseFilter.rank === 4, ()=>`Error in separableConv2d: depthwise filter must be rank 4, but ` + `got rank ${$depthwiseFilter.rank}.`);
    _util.assert($pointwiseFilter.rank === 4, ()=>`Error in separableConv2d: pointwise filter must be rank 4, but ` + `got rank ${$depthwiseFilter.rank}.`);
    _util.assert($pointwiseFilter.shape[0] === 1, ()=>`Error in separableConv2d: the first dimension of pointwise filter ` + ` must be 1, but got ${$pointwiseFilter.shape[0]}.`);
    _util.assert($pointwiseFilter.shape[1] === 1, ()=>`Error in separableConv2d: the second dimension of pointwise ` + `filter must be 1, but got ${$pointwiseFilter.shape[1]}.`);
    const inChannels = $depthwiseFilter.shape[2];
    const channelMultiplier = $depthwiseFilter.shape[3];
    _util.assert($pointwiseFilter.shape[2] === inChannels * channelMultiplier, ()=>`Error in separableConv2d: the third dimension of pointwise filter ` + `must be ${inChannels * channelMultiplier}, ` + `but got ${$pointwiseFilter.shape[2]}.`);
    const depthwise = (0, _depthwiseConv2D.depthwiseConv2d)(x4D, $depthwiseFilter, strides, pad, dataFormat, dilation);
    const pointwiseStride = 1;
    const res = (0, _conv2D.conv2d)(depthwise, $pointwiseFilter, pointwiseStride, "valid", dataFormat);
    if (reshapedTo4D) return (0, _reshape.reshape)(res, [
        res.shape[1],
        res.shape[2],
        res.shape[3]
    ]);
    return res;
}
2-D convolution with separable filters.

Performs a depthwise convolution that acts separately on channels followed
by a pointwise convolution that mixes channels. Note that this is
separability between dimensions [1, 2] and 3, not spatial separability
between dimensions 1 and 2.

See
[https://www.tensorflow.org/api_docs/python/tf/nn/separable_conv2d](
    https://www.tensorflow.org/api_docs/python/tf/nn/separable_conv2d)
for more details.

@param x The input tensor, of rank 4 or rank 3, of shape
    `[batch, height, width, inChannels]`. If rank 3, batch of 1 is
assumed.
@param depthwiseFilter The depthwise filter tensor, rank 4, of shape
    `[filterHeight, filterWidth, inChannels, channelMultiplier]`. This is
    the filter used in the first step.
@param pointwiseFilter The pointwise filter tensor, rank 4, of shape
    `[1, 1, inChannels * channelMultiplier, outChannels]`. This is
    the filter used in the second step.
@param strides The strides of the convolution: `[strideHeight,
strideWidth]`. If strides is a single number, then `strideHeight ==
strideWidth`.
@param pad The type of padding algorithm.
  - `same` and stride 1: output will be of same size as input,
      regardless of filter size.
  - `valid`: output will be smaller than input if filter is larger
      than 1x1.
  - For more info, see this guide:
    [https://www.tensorflow.org/api_docs/python/tf/nn/convolution](
         https://www.tensorflow.org/api_docs/python/tf/nn/convolution)
@param dilations The dilation rates: `[dilationHeight, dilationWidth]`
    in which we sample input values across the height and width dimensions
    in atrous convolution. Defaults to `[1, 1]`. If `rate` is a single
    number, then `dilationHeight == dilationWidth`. If it is greater than
    1, then all values of `strides` must be 1.
@param dataFormat: An optional string from: "NHWC", "NCHW". Defaults to
    "NHWC". Specify the data format of the input and output data. With the
    default format "NHWC", the data is stored in the order of: [batch,
    height, width, channels]. Only "NHWC" is currently supported.

@doc {heading: 'Operations', subheading: 'Convolution'}