AdaILN(Adaptive Instance Layer Normalization)

class adaILN(nn.Module):

    def __init__(selfnum_featureseps=1e-5):

        super(adaILN, self).__init__()

        self.eps=eps

        定义rho为可训练类型,buffer为不可训练类型

        self.rho = Parameter(torch.Tensor(1, num_features, 11))

        self.rho.data.fill_(0.9)

 

    def forward(selfinputgammabeta):

        返回Instances的均值和方差,shape=(B,C,1,1)

        in_mean, in_var = torch.mean(inputdim=[23], keepdim=True), torch.var(inputdim=[23], keepdim=True)

        进行零均值标准化

        out_in = (input - in_mean) / torch.sqrt(in_var + self.eps)

        返回Layers的均值和方差,shape=(B,1,1,1)

        ln_mean, ln_var = torch.mean(inputdim=[123], keepdim=True), torch.var(inputdim=[123], keepdim=True)

        进行零均值标准化

        out_ln = (input - ln_mean) / torch.sqrt(ln_var + self.eps)

        # ρ*IN+(1-ρ)*LN

        out = self.rho.expand(input.shape[0], -1, -1, -1) * out_in + (1 - self.rho.expand(input.shape[0], -1, -1, -1)) * out_ln

        # gammabeta均为全连接得到的系数

        out = out * gamma.unsqueeze(2).unsqueeze(3) + beta.unsqueeze(2).unsqueeze(3)

 

        return out

 

综合了Instance Normalization和Layer Normalization的优点,通过可学习的系数ρ调整两种归一化的权重。

posted @ 2020-09-03 20:07  Junzhao  阅读(946)  评论(0)    收藏  举报