После того как нейрон сложил взвешенные входы, его выход определяет функция активации. Без неё нейронная сеть могла бы выучить только прямые линии.
Реализуйте activate(name, values) и примените указанную функцию к каждому значению:
| name | формула |
|---|---|
"sigmoid" | 1 / (1 + e^(-x)) |
"relu" | max(0, x) |
"leaky_relu" | x, если x > 0, иначе 0.01 × x |
"tanh" | (e^x - e^(-x)) / (e^x + e^(-x)) |
Входные данные
name: одно из "sigmoid", "relu", "leaky_relu" или "tanh".
values: список чисел.
Выходные данные
Верните список, где функция активации применена к каждому значению, в том же порядке.
Ограничения
1 ≤ длина values ≤ 1000
-50 ≤ каждое значение ≤ 50
Примеры
Ввод:
name = "sigmoid"
values = [0.0, 2.0, -2.0]
Ожидаемый вывод:
expected = [0.5, 0.880797, 0.119203]
Ввод:
std::string name = "sigmoid";
std::vector<double> values = {0.0, 2.0, -2.0};
Ожидаемый вывод:
std::vector<double> expected = {0.5, 0.880797, 0.119203};
Ввод:
string name = "sigmoid";
double[] values = new double[] {0.0, 2.0, -2.0};
Ожидаемый вывод:
double[] expected = new double[] {0.5, 0.880797, 0.119203};
Пояснение
sigmoid(0) = 1 / (1 + 1) = 0.5, sigmoid(2) ≈ 0.880797 и sigmoid(-2) ≈ 0.119203. Сигмоида сжимает любое число в диапазон от 0 до 1.
Ввод:
name = "relu"
values = [-1.5, 0.0, 3.0]
Ожидаемый вывод:
expected = [0.0, 0.0, 3.0]
Ввод:
std::string name = "relu";
std::vector<double> values = {-1.5, 0.0, 3.0};
Ожидаемый вывод:
std::vector<double> expected = {0.0, 0.0, 3.0};
Ввод:
string name = "relu";
double[] values = new double[] {-1.5, 0.0, 3.0};
Ожидаемый вывод:
double[] expected = new double[] {0.0, 0.0, 3.0};
Пояснение
ReLU сохраняет положительные значения и превращает отрицательные в 0: [0, 0, 3].
Ссылки
Это задание адаптировано для CodeUtility. Следуйте условию и ограничениям выше.