| 83 | } |
| 84 | |
| 85 | VARP _Deconv(std::vector<int8_t>&& weight, std::vector<float>&& bias, std::vector<float>&& scale, VARP x, INTS channel, INTS kernelSize, |
| 86 | PaddingMode pad, INTS stride, INTS dilate, int group, INTS pads, bool relu, bool relu6, int8_t inputZeroPoint, int8_t outputZeroPoint, |
| 87 | int8_t maxValue, int8_t minValue) { |
| 88 | std::unique_ptr<OpT> convOp(new OpT); |
| 89 | convOp->type = OpType_Deconvolution; |
| 90 | if (channel[0] == channel[1] && channel[0] == group) { |
| 91 | convOp->type = OpType_DeconvolutionDepthwise; |
| 92 | } |
| 93 | convOp->main.type = OpParameter_Convolution2D; |
| 94 | convOp->main.value = new Convolution2DT; |
| 95 | auto conv2D = convOp->main.AsConvolution2D(); |
| 96 | conv2D->common.reset(new Convolution2DCommonT); |
| 97 | conv2D->common->padMode = _convertPadMode(pad); |
| 98 | if (pads.size() == 2) { |
| 99 | conv2D->common->padX = pads[0]; |
| 100 | conv2D->common->padY = pads[1]; |
| 101 | } else { |
| 102 | conv2D->common->pads = std::move(pads); |
| 103 | } |
| 104 | conv2D->common->strideX = stride[0]; |
| 105 | conv2D->common->strideY = stride[1]; |
| 106 | conv2D->common->group = group; |
| 107 | conv2D->common->outputCount = channel[1]; |
| 108 | conv2D->common->inputCount = channel[0]; |
| 109 | conv2D->common->dilateX = dilate[0]; |
| 110 | conv2D->common->dilateY = dilate[1]; |
| 111 | conv2D->common->kernelX = kernelSize[0]; |
| 112 | conv2D->common->kernelY = kernelSize[1]; |
| 113 | conv2D->common->relu6 = relu6; |
| 114 | conv2D->common->relu = relu; |
| 115 | conv2D->quanParameter = IDSTEncoder::encode(nullptr, scale, channel[1], channel[0] * kernelSize[0] * kernelSize[1], false, weight.data(), -128); |
| 116 | conv2D->symmetricQuan.reset(new QuantizedFloatParamT); |
| 117 | conv2D->bias = std::move(bias); |
| 118 | return (Variable::create(Expr::create(convOp.get(), {x}))); |
| 119 | } |
| 120 | |
| 121 | class DeconvolutionCommonTest : public MNNTestCase { |
| 122 | public: |
no test coverage detected