为什么在 Netron 中查看架构时,没有显示紧跟在卷积层之后的归一化层?
Why is it that when viewing the architecture in Netron, the normalization layer that goes right after the convolutional layer is not shown?
我测试了卷积神经网络架构的一些变化。我试图在 conv 层之后添加 BatchNorm 层,而不是添加激活层。然后我用 BatchNorm 层交换了激活层。
# here example of conv-> b_norm -> activation
...
nn.Conv2d(out_, out_, kernel_size=(1, 3), padding=(0, 1), bias=False),
nn.BatchNorm2d(out_),
nn.LeakyReLU(),
...
# here example of conv-> activation -> b_norm
...
nn.Conv2d(out_, out_, kernel_size=(1, 3), padding=(0, 1), bias=False),
nn.LeakyReLU(),
nn.BatchNorm2d(out_),
...
我注意到在 Netron(用于可视化 NN 架构的应用程序)中,conv 之后 b_norm 的架构中没有 batch_norm,但另一个架构中有 b_norm 激活后。
所以我的问题是:卷积后的归一化层有什么特殊意义还是netron有问题?
在卷积运算之后看不到 Batch Norm 的事实与 Batch Norm Folding 有关。 Batch Norm后面的卷积运算可以只用一个不同权重的卷积代替。
我假设,对于 Netron 可视化,您首先要转换为 ONNX 格式。
在 PyTorch 中,Batch Norm Folding 优化默认由 torch.onnx.export
执行,其中 eval mode 是 default one。您可以通过在训练模式下转换为 ONNX 来禁用此行为:
torch.onnx.export(..., training=TrainingMode.TRAINING,...)
然后您应该能够在图表中看到所有 Batch Norm 层。
我测试了卷积神经网络架构的一些变化。我试图在 conv 层之后添加 BatchNorm 层,而不是添加激活层。然后我用 BatchNorm 层交换了激活层。
# here example of conv-> b_norm -> activation
...
nn.Conv2d(out_, out_, kernel_size=(1, 3), padding=(0, 1), bias=False),
nn.BatchNorm2d(out_),
nn.LeakyReLU(),
...
# here example of conv-> activation -> b_norm
...
nn.Conv2d(out_, out_, kernel_size=(1, 3), padding=(0, 1), bias=False),
nn.LeakyReLU(),
nn.BatchNorm2d(out_),
...
我注意到在 Netron(用于可视化 NN 架构的应用程序)中,conv 之后 b_norm 的架构中没有 batch_norm,但另一个架构中有 b_norm 激活后。 所以我的问题是:卷积后的归一化层有什么特殊意义还是netron有问题?
在卷积运算之后看不到 Batch Norm 的事实与 Batch Norm Folding 有关。 Batch Norm后面的卷积运算可以只用一个不同权重的卷积代替。
我假设,对于 Netron 可视化,您首先要转换为 ONNX 格式。
在 PyTorch 中,Batch Norm Folding 优化默认由 torch.onnx.export
执行,其中 eval mode 是 default one。您可以通过在训练模式下转换为 ONNX 来禁用此行为:
torch.onnx.export(..., training=TrainingMode.TRAINING,...)
然后您应该能够在图表中看到所有 Batch Norm 层。