Pytorch 可学习的 LeakyReLU 激活函数

Learnable LeakyReLU activation function with Pytorch

我正在尝试为 Invertible trainable LeakyReLu 编写 class,其中模型在每次迭代中修改 negative_slope,

class InvertibleLeakyReLU(nn.Module):
  def __init__(self, negative_slope):
    super(InvertibleLeakyReLU, self).__init__()
    self.negative_slope = torch.tensor(negative_slope, requires_grad=True)
  def forward(self, input, logdet = 0, reverse = False):
    if reverse == True:
      input = torch.where(input>=0.0, input, input *(1/self.negative_slope))

      log = - torch.where(input >= 0.0, torch.zeros_like(input), torch.ones_like(input) * math.log(self.negative_slope))
      logdet = (sum(log, dim=[1, 2, 3]) +logdet).mean()
      return input, logdet
    else:
      input = torch.where(input>=0.0, input, input *(self.negative_slope))

      log = torch.where(input >= 0.0, torch.zeros_like(input), torch.ones_like(input) * math.log(self.negative_slope)) 
      logdet = (sum(log, dim=[1, 2, 3]) +logdet).mean()
      return input, logdet 

但是我设置了 requires_grad=True,负斜率不会更新。还有其他我必须修改的地方吗?

您的优化器知道它应该更新 InvertibleLeakyReLU.negative_slope 吗?
我的猜测是 - 不:
self.negative_slope 未定义为 nn.Parameter,因此,默认情况下,当您使用 model.parameters() 初始化优化器时,negative_slope 而不是 优化参数。

您可以将 negative_slope 定义为 nn.Parameter:

self.negative_slope = nn.Parameter(data=torch.tensor(negative_slope), requires_grad=True)

或者,将模型中所有 InvertibleLeakyReLUnegative_slope 显式传递给优化器。