|
|
|
@ -158,17 +158,49 @@ class BatchNormOpConverter : public OpConverter {
|
|
|
|
|
TensorRTEngine::Weight power_weights{nvinfer1::DataType::kFLOAT, nullptr,
|
|
|
|
|
0};
|
|
|
|
|
|
|
|
|
|
nvinfer1::IScaleLayer* layer =
|
|
|
|
|
TRT_ENGINE_ADD_LAYER(engine_, Scale, *const_cast<nvinfer1::ITensor*>(X),
|
|
|
|
|
nvinfer1::ScaleMode::kCHANNEL, shift_weights.get(),
|
|
|
|
|
scale_weights.get(), power_weights.get());
|
|
|
|
|
int dynamic_shape_offset = engine_->with_dynamic_shape() ? 1 : 0;
|
|
|
|
|
nvinfer1::ILayer* layer = nullptr;
|
|
|
|
|
nvinfer1::IShuffleLayer* expand_layer = nullptr;
|
|
|
|
|
nvinfer1::IShuffleLayer* squeeze_layer = nullptr;
|
|
|
|
|
|
|
|
|
|
auto x_dim = X->getDimensions();
|
|
|
|
|
if (x_dim.nbDims < 3 + dynamic_shape_offset) {
|
|
|
|
|
nvinfer1::Dims expand_shape;
|
|
|
|
|
expand_shape.nbDims = 3 + dynamic_shape_offset;
|
|
|
|
|
for (int i = 0; i < 3 + dynamic_shape_offset; i++) {
|
|
|
|
|
if (i < x_dim.nbDims) {
|
|
|
|
|
expand_shape.d[i] = x_dim.d[i] < 0 ? 0 : x_dim.d[i];
|
|
|
|
|
} else {
|
|
|
|
|
expand_shape.d[i] = 1;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
expand_layer = TRT_ENGINE_ADD_LAYER(engine_, Shuffle, *X);
|
|
|
|
|
expand_layer->setReshapeDimensions(expand_shape);
|
|
|
|
|
X = expand_layer->getOutput(0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
layer = TRT_ENGINE_ADD_LAYER(
|
|
|
|
|
engine_, Scale, *X, nvinfer1::ScaleMode::kCHANNEL, shift_weights.get(),
|
|
|
|
|
scale_weights.get(), power_weights.get());
|
|
|
|
|
|
|
|
|
|
auto output_name = op_desc.Output("Y").front();
|
|
|
|
|
engine_->SetWeights(op_desc.Input("Bias").front(),
|
|
|
|
|
std::move(combile_bias_tensor));
|
|
|
|
|
engine_->SetWeights(op_desc.Input("Scale").front(),
|
|
|
|
|
std::move(combile_scale_tensor));
|
|
|
|
|
RreplenishLayerAndOutput(layer, "pool2d", {output_name}, test_mode);
|
|
|
|
|
if (x_dim.nbDims < 3 + dynamic_shape_offset) {
|
|
|
|
|
nvinfer1::Dims squeeze_shape;
|
|
|
|
|
squeeze_shape.nbDims = x_dim.nbDims;
|
|
|
|
|
for (int i = 0; i < squeeze_shape.nbDims; i++) {
|
|
|
|
|
squeeze_shape.d[i] = x_dim.d[i] < 0 ? 0 : x_dim.d[i];
|
|
|
|
|
}
|
|
|
|
|
squeeze_layer =
|
|
|
|
|
TRT_ENGINE_ADD_LAYER(engine_, Shuffle, *(layer->getOutput(0)));
|
|
|
|
|
squeeze_layer->setReshapeDimensions(squeeze_shape);
|
|
|
|
|
layer = static_cast<nvinfer1::ILayer*>(squeeze_layer);
|
|
|
|
|
}
|
|
|
|
|
RreplenishLayerAndOutput(layer, "batchnorm_add_scale", {output_name},
|
|
|
|
|
test_mode);
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|