如何决定“kaiming_normal”初始化使用哪种模式

Moh*_*mba 4 initialization pytorch

我已经阅读了几个使用nn.init.kaiming_normal_()PyTorch进行层初始化的代码。某些代码使用fan in默认模式。在众多示例中,可以在此处找到一个示例并显示如下。

init.kaiming_normal(m.weight.data, a=0, mode='fan_in')
Run Code Online (Sandbox Code Playgroud)

但是,有时我会看到人们使用此处和下图所示的fan out模式。

if isinstance(m, nn.Conv2d):
                nn.init.kaiming_normal_(m.weight, mode='fan_out', nonlinearity='relu')

Run Code Online (Sandbox Code Playgroud)

有人可以给我一些指导方针或提示来帮助我决定选择哪种模式吗?此外,我正在使用 PyTorch 进行图像超分辨率和去噪任务,哪种模式更有益。

Szy*_*zke 5

根据文档

选择“fan_in”会保留前向传递中权重方差的大小。选择“fan_out”会保留向后传递的幅度。

并根据深入研究整流器:在 ImageNet 分类上超越人类水平的表现 - He, K. 等人。(2015) :

我们注意到使用 Eqn.(14) 或 Eqn.(10) 就足够了

其中方程(10)和方程(14)是fan_infan_out适当的。此外:

这意味着如果初始化适当地缩放后向信号,那么前向信号也是这种情况;反之亦然。对于本文中的所有模型,两种形式都可以使它们收敛

所以总而言之,这并不重要但更重要的是你追求的是什么。我假设如果您怀疑您的反向传递可能更“混乱”(更大的差异),那么值得将模式更改为fan_out. 当损失波动很大时,可能会发生这种情况(例如,非常简单的例子后跟非常困难的例子)。

的正确选择nonlinearity更重要,您当前正在初始化的图层之后nonlinearity使用的激活在哪里。当前默认值将其设置为with ,这实际上与. 如果你正在使用你应该改变它的斜率。leaky_relua=0reluleaky_relua