我想在我的 CNN 的 C++/CUDNN 实现中引入批量标准化。该实现目前在 MNIST 数据集上表现良好(没有 BN)。
我正在使用 Batch Norm 的 CUDNN 实现,但是在仔细阅读了 Batch Norm 论文和 CUDNN 文档之后,我仍然有一些不清楚的地方。
- 据我了解,批量规范层位于卷积/密集层的输出和非线性之间,例如:
u --->[conv/dense (weights W)]--->[BN]--->[ReLU]---> y = ReLU(BN(W*u))
在一些文献中,我读到将批处理规范层放在非线性之后是一个更好的选择。这是真的?
CUDNN 文档说对卷积层使用 BATCHNORM_MODE_SPATIAL,对密集层使用 BATCHNORM_MODE_PER_ACTIVATION。但是,在另一个实现(YOLO / Darknet)中,我只看到使用了 BATCHNORM_MODE_SPATIAL。所以我问自己 SPATIAL 是否也适用于密集层?
如前所述,据我了解, BATCHNORM_MODE_SPATIAL 应该用于卷积层:但是在它们的输入上(即卷积之前),还是在它们的输出上(即卷积之后)?
据我了解,它将用于输出,例如:
u ---->[ conv (weights W) ] ---->[BN with mode SPATIAL]----->[ReLU]---> y
它是否正确?
我看到在 Darknet / YOLO 中,他们没有使用从 cudnnBatchNormalizationBackward() 获得的增量显式更新参数。这种方法是否也直接执行参数更新?我没有找到这方面的任何信息,实际上在从 cudnnBatchNormalizationBackward 方法获得 Gamma 和 Beta 梯度后,我正在应用梯度下降更新。
我看到在 CUDNN 实现中,可以使用 Forward 推理方法。在推理阶段完全跳过 BN 单元可以吗?在这种情况下,我将使用 BN 单元进行训练,并在推理过程中将它们从网络中移除。
我真的提前感谢您的耐心和您的帮助。我试图独自摆脱这些问题很长时间,但我现在被阻止了......非常感谢您的帮助。