为什么Netron将我模型的BatchNorm2d层渲染为bias且BN层消失?
问题原因
你遇到的是PyTorch导出ONNX时默认优化行为导致的正常现象,并非代码逻辑错误。
PyTorch默认在导出ONNX时会对推理模式的网络执行算子融合优化,其中就包含卷积层+BN层的融合逻辑:BN层的缩放、偏移参数会被直接折算到前面相邻卷积层的权重与偏置项中,融合后的卷积层会自带bias参数,原本独立的BN层会被直接移除,这就是你在Netron中看不到BN层、反而无bias的卷积层出了bias参数的原因。你删除所有卷积层后没有可融合的算子对象,BN层自然就可以正常显示。
解决方案
如果需要保留独立BN层方便查看原始网络结构,只需要在导出ONNX时关闭常量折叠优化即可,修改导出代码如下:
torch.onnx.export(m, (torch.ones(1,3,24,24),), 'test.onnx', do_constant_folding=False)
如果修改后仍未生效,可以在导出前将模型切换为训练模式,因为Conv-BN融合仅对eval模式的模型生效:
m.train() torch.onnx.export(m, (torch.ones(1,3,24,24),), 'test.onnx', do_constant_folding=False)
内容的提问来源于stack exchange,提问作者walker
相关产品推荐
相关产品推荐

