Pytorch 自定义激活函数?

Pytorch custom activation functions?

我在 Pytorch 中实现自定义激活函数时遇到问题,例如 Swish。我应该如何在 Pytorch 中实现和使用自定义激活函数?

您可以编写如下自定义激活函数(例如加权 Tanh)。

class weightedTanh(nn.Module):
    def __init__(self, weights = 1):
        super().__init__()
        self.weights = weights

    def forward(self, input):
        ex = torch.exp(2*self.weights*input)
        return (ex-1)/(ex+1)

如果您使用 autograd 兼容的操作,就不必担心反向传播。

四种 种可能性,具体取决于您要查找的内容。您需要问自己两个问题:

Q1)你的激活函数会有可学习的参数吗?

如果,您别无选择,只能将激活函数创建为nn.Module class,因为您需要存储这些权重。

如果,您可以自由地简单地创建一个普通函数,或者一个class,这取决于您方便什么。

Q2)你的激活函数可以表示为现有PyTorch函数的组合吗?

如果,您可以简单地将其编写为现有 PyTorch 函数的组合,而不需要创建定义梯度的 backward 函数。

如果您将需要手写渐变。

例1:SiLU函数

SiLU 函数 f(x) = x * sigmoid(x) 没有任何学习权重,可以完全用现有的 PyTorch 函数编写,因此您可以简单地将其定义为函数:

def silu(x):
    return x * torch.sigmoid(x)

然后像使用 torch.relu 或任何其他激活函数一样简单地使用它。

示例 2:具有学习斜率的 SiLU

在这种情况下,您有一个学习参数,即斜率,因此您需要对其进行 class。

class LearnedSiLU(nn.Module):
    def __init__(self, slope = 1):
        super().__init__()
        self.slope = slope * torch.nn.Parameter(torch.ones(1))

    def forward(self, x):
        return self.slope * x * torch.sigmoid(x)

例3:带向后

如果您需要创建自己的渐变函数,可以查看此示例:Pytorch: define custom function