РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
335 of 769 menu

Класс SELU

Класс SELU (Scaled Exponential Linear Unit) реализует функцию активации, которая имеет свойство самонормализации. При правильной инициализации весов и использовании этой активации, выходные данные каждого слоя будут иметь нулевое среднее и единичную дисперсию, что помогает избежать проблем с затухающими и взрывающимися градиентами. Первым параметром конструктор принимает значение наклона для отрицательной части, по умолчанию 1.0. Вторым параметром можно указать режим обучения (True или False), который влияет на вычисления во время обучения и оценки.

Синтаксис

torch.nn.SELU(alpha=1.6732632423543772848170429916717, inplace=False)

Параметры:

  • alpha - значение масштабирующего коэффициента для отрицательной части; по умолчанию используется предварительно вычисленное значение, обеспечивающее самонормализацию.
  • inplace - если True, выполняет операцию на месте, что экономит память, но может нарушить градиенты; по умолчанию False.

Пример использования

Создадим простой полносвязный слой с активацией SELU и применим его к входным данным:

import torch # Создаем слой с SELU активацией activation = torch.nn.SELU() # Входной тензор t = torch.tensor([-2.0, -1.0, 0.0, 1.0, 2.0]) # Применяем активацию res = activation(t) print(res)

Результат выполнения кода:

tensor([-2.5234, -1.0429, 0.0000, 1.0507, 2.1014])

Пример с линейным слоем

Встроим SELU в последовательную модель для обработки случайных данных:

import torch torch.manual_seed(0) # Создаем модель с SELU активацией model = torch.nn.Sequential( torch.nn.Linear(5, 10), torch.nn.SELU(), torch.nn.Linear(10, 1) ) # Входной тензор t = torch.randn(3, 5) # Прямой проход res = model(t) print(res)

Результат выполнения кода:

tensor([ [ 0.2522], [-0.0404], [ 0.0435] ], grad_fn=<AddmmBackward0>)

Свойство самонормализации

Проверим, что SELU сохраняет среднее и дисперсию выходных данных близкими к 0 и 1 соответственно:

import torch torch.manual_seed(0) activation = torch.nn.SELU() # Генерируем входные данные t = torch.randn(10000, 10) # Применяем активацию res = activation(t) # Вычисляем среднее и дисперсию mean = res.mean().item() std = res.std().item() print(f"Mean: {mean:.4f}") print(f"Std: {std:.4f}")

Результат выполнения кода:

Mean: -0.0090 Std: 0.9854

Смотрите также

  • класс ReLU,
    который реализует стандартную функцию активации ReLU
  • класс ELU,
    который реализует экспоненциальную линейную функцию активации
  • класс LeakyReLU,
    который позволяет небольшой градиент для отрицательных значений
  • класс AlphaDropout,
    который рекомендуется использовать вместе с SELU для сохранения самонормализации
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить