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)
或者,将模型中所有 InvertibleLeakyReLU
的 negative_slope
显式传递给优化器。
我正在尝试为 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)
或者,将模型中所有 InvertibleLeakyReLU
的 negative_slope
显式传递给优化器。