为什么Netron中卷积层后紧邻的归一化层无法显示?
问题原因说明
这是Netron默认的算子融合折叠显示逻辑导致的,既不是BatchNorm层有特殊设计,也不是Netron本身存在功能bug。
具体原理
- 当下主流深度学习框架(PyTorch、TensorFlow等)都会在推理阶段对「无偏置Conv层+紧邻的BatchNorm层」做算子融合优化:将两个层的计算参数合并为单一卷积的参数,减少计算量提升推理速度。
- Netron默认开启了融合算子的折叠显示规则,会把符合融合条件的Conv+BN组合合并为单个节点展示,因此第一种
Conv->BN->激活的结构中,BN层会被折叠进前面的Conv节点,不会单独显示。 - 第二种
Conv->激活->BN的结构中,BN和Conv中间隔了激活层,不满足算子融合的前提条件,因此Netron不会做折叠处理,BN层可以正常显示。
验证方法
你可以在Netron的设置菜单中关闭算子折叠相关的选项,就可以看到第一种结构中被隐藏的BN层。
两种结构的代码示例
# 第一种:conv-> b_norm -> activation 符合融合条件,BN会被折叠 ... nn.Conv2d(out_, out_, kernel_size=(1, 3), padding=(0, 1), bias=False), nn.BatchNorm2d(out_), nn.LeakyReLU(), ... # 第二种:conv-> activation -> b_norm 不符合融合条件,BN正常显示 ... nn.Conv2d(out_, out_, kernel_size=(1, 3), padding=(0, 1), bias=False), nn.LeakyReLU(), nn.BatchNorm2d(out_), ...
内容的提问来源于stack exchange,提问作者Anvar Ganiev
相关产品推荐
相关产品推荐

