AdaILN(Adaptive Instance Layer Normalization)
class adaILN(nn.Module):
def __init__(self, num_features, eps=1e-5):
super(adaILN, self).__init__()
self.eps=eps
# 定义rho为可训练类型,buffer为不可训练类型
self.rho = Parameter(torch.Tensor(1, num_features, 1, 1))
self.rho.data.fill_(0.9)
def forward(self, input, gamma, beta):
# 返回Instances的均值和方差,shape=(B,C,1,1)
in_mean, in_var = torch.mean(input, dim=[2, 3], keepdim=True), torch.var(input, dim=[2, 3], 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(input, dim=[1, 2, 3], keepdim=True), torch.var(input, dim=[1, 2, 3], 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
# gamma和beta均为全连接得到的系数
out = out * gamma.unsqueeze(2).unsqueeze(3) + beta.unsqueeze(2).unsqueeze(3)
return out
综合了Instance Normalization和Layer Normalization的优点,通过可学习的系数ρ调整两种归一化的权重。

浙公网安备 33010602011771号