Пользовательские функции активации Pytorch? - PullRequest
1 голос
/ 19 апреля 2019

У меня проблемы с реализацией пользовательских функций активации в Pytorch, таких как Swish.Как мне реализовать и использовать пользовательские функции активации в Pytorch?

Ответы [ 2 ]

1 голос
/ 19 апреля 2019

Вы можете написать настраиваемую функцию активации, как показано ниже (например, взвешенный 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 совместимые операции.

0 голосов
/ 12 июля 2019

Есть четыре возможности в зависимости от того, что вы ищете. Вам нужно будет задать себе два вопроса:

Q1) Будут ли у вашей функции активации настраиваемые параметры?

Если yes , у вас нет выбора для создания функции активации в качестве класса nn.Module, потому что вам нужно хранить эти веса.

Если нет , вы можете просто создать обычную функцию или класс, в зависимости от того, что вам удобно.

Q2) Может ли ваша функция активации быть выражена как комбинация существующих функций PyTorch?

Если да , вы можете просто написать это как комбинацию существующей функции PyTorch, и вам не нужно будет создавать функцию backward, которая определяет градиент.

Если нет , вам нужно будет написать градиент вручную.

Пример 1: функция Swish

Функция swish f(x) = x * sigmoid(x) не имеет изученных весов и может быть полностью записана с использованием существующих функций PyTorch, поэтому вы можете просто определить ее как функцию:

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

, а затем просто используйте его, как если бы вы имели torch.relu или любую другую функцию активации.

Пример 2. Swish с выученным уклоном

В этом случае у вас есть один запомненный параметр - наклон, поэтому вам нужно сделать из него класс.

class LearnedSwish(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: определить пользовательскую функцию

...