def METHOD_NAME(input_shape, strides, paddings, kernels,
                               dilations=(1, 1), op_type='Pooling', ceil_mode=True):
    # TODO 补充dilation
    assert len(input_shape) == 4
    h_i, w_i = input_shape[2:4]
    pad_h, pad_w, _ = get_symmetric_padding(strides, paddings, op_type)
    stride_h, stride_w = strides
    kernel_h, kernel_w = kernels
    dilation_h, dilation_w = dilations
    if op_type == 'Pooling':
        if ceil_mode:
            h_o = math.ceil((h_i + 2 * pad_h - kernel_h) / stride_h) + 1
            w_o = math.ceil((w_i + 2 * pad_w - kernel_w) / stride_w) + 1
        else:
            h_o = math.floor((h_i + 2 * pad_h - kernel_h) / stride_h) + 1
            w_o = math.floor((w_i + 2 * pad_w - kernel_w) / stride_w) + 1
        # this is interesting
        if pad_h + pad_w > 0:
            h_o -= 1 if (h_o - 1) * stride_h >= h_i + pad_h else 0
            w_o -= 1 if (w_o - 1) * stride_w >= w_i + pad_w else 0
    elif op_type == 'Convolution':
        k_h_ext = dilation_h * (kernel_h - 1) + 1
        k_w_ext = dilation_w * (kernel_w - 1) + 1
        h_o = int((h_i + 2 * pad_h - k_h_ext) / stride_h + 1)
        w_o = int((w_i + 2 * pad_w - k_w_ext) / stride_w + 1)
    elif op_type == 'Unpool':
        h_o = (h_i - 2 * pad_h - kernel_h + stride_h) * stride_h
        w_o = (w_i - 2 * pad_w - kernel_w + stride_w) * stride_w
    else:
        logging.warning('unknown op type:{}, use default compute'.format(op_type))
        h_o = int((h_i + 2 * pad_h - kernel_h) / stride_h + 1)
        w_o = int((w_i + 2 * pad_w - kernel_w) / stride_w + 1)
    return h_o, w_o