Сделайте ReLU1 в PyTorch - PullRequest
0 голосов
/ 25 мая 2020

Я хочу использовать нелинейную активацию ReLU1. ReLU1 линейно в [0,1], но фиксирует значения меньше 0 до 0 и зажимает значения больше 1 до 1 .

Он будет использоваться только для последний слой моего глубокого net в PyTorch с действительно высоким разрешением 2048x4096. Поскольку код должен быть сильно оптимизирован с точки зрения скорости и памяти, я не знаю, какая из следующих реализаций будет лучшей.

Ниже приведены две реализации, которые я могу придумать для тензора x: -

x.clamp_(min=0.0, max=1.0) Для этого я не могу увидеть исходный код, указанный в его документах . Так что не знаю, лучший ли это выбор. Я предпочитаю работу на месте, так как через нее может происходить обратное распространение.

Вторая альтернатива, которая у меня есть, - использовать torch.nn.functional.hardtanh_(x, min_val=0.0, max_val=1.0). Это определенно действующая функция, и в исходном коде указано, что она использует файл C ++ torch._C._nn.hardtanh(input, min_val, max_val), поэтому я думаю, что это будет быстро.

Пожалуйста, предложите, какая реализация является наиболее эффективной и, если возможно, другую.

Спасибо

1 Ответ

1 голос
/ 26 мая 2020

Не пытаясь, я предполагаю, что clamp и hardtanh будут иметь одинаковую скорость, и будет трудно выполнить эту операцию быстрее, если вы оптимизируете ее изолированно. Арифметическое значение c тривиально, поэтому эта операция будет ограничена пропускной способностью памяти графического процессора. Чтобы работать быстрее, вам нужно объединить эту операцию с операцией, которая произвела x. Если вы не хотите писать собственное ядро ​​для комбинированной операции, вы можете попробовать использовать TorchScript .

...