转trt模型时报错: ASSERT(begPadding == endPadding && “TensorRT does not support asymmetrical padding for 3D deconvolutions!”, ErrorCode::kUNSUPPORTED_NODE);
原因:TensorRT目前还不支持3D反卷积非对称padding
解决方法:
- 找到源码TensorRT/parsers/onnx/builtin_op_importers.cpp文件,找到ConvTranspose
- 删除以下代码:
if (outputPadding != makeDims(nbSpatialDims, 0) && autoPadMode == std::string("NOTSET"))
{
for (int i = 0; i < nbSpatialDims; ++i)
{
if (endPadding.d[i] - outputPadding.d[i] >= 0)
{
endPadding.d[i] -= outputPadding.d[i];
outputPadding.d[i] = 0;
}
else
{
// Reduce outputPadding as possible.
outputPadding.d[i] -= endPadding.d[i];
endPadding.d[i] = 0;
hasOutputPadding = true;
}
}
}
- 在删除代码处添加以下代码:
bool hasOutputPadding = false;
for (int i = 0; i < nbSpatialDims; ++i) {
if (outputPadding.d[i] > 0) {
hasOutputPadding = true;
}
}
- 重新编译源码,将相关lib文件替换到自己的第三方路径下即可。
注意!!!!!!!!!!!!!!!!!!!!!!!
该方法会导致一定的精度损失,虽然笔者测试了多个模型都没有问题,但使用仍需谨慎!!!
为啥要这样改以及为什么会造成损失,大家可以去了解一下反卷积/卷积转置的prePadding和outPadding的实现
如果这样改的影响实在过大就自定义op吧,笔者前面有介绍如何写动态卷积以及动态卷积转置自定义op