Problème
Une fois qu'un neurone a additionné ses entrées pondérées, une fonction d'activation décide de sa sortie. Sans elle, un réseau de neurones ne pourrait apprendre que des droites.
Implémentez activate(name, values) et appliquez la fonction indiquée à chaque valeur :
| name | formule |
|---|---|
"sigmoid" | 1 / (1 + e^(-x)) |
"relu" | max(0, x) |
"leaky_relu" | x si x > 0, sinon 0.01 × x |
"tanh" | (e^x - e^(-x)) / (e^x + e^(-x)) |
Entrée
name : l'une des valeurs "sigmoid", "relu", "leaky_relu" ou "tanh".
values : une liste de nombres.
Sortie
Renvoyez une liste où l'activation est appliquée à chaque valeur, dans le même ordre.
Contraintes
1 ≤ longueur de values ≤ 1 000
-50 ≤ chaque valeur ≤ 50
Exemples
Entrée :
name = "sigmoid"
values = [0.0, 2.0, -2.0]
Sortie attendue :
expected = [0.5, 0.880797, 0.119203]
Entrée :
std::string name = "sigmoid";
std::vector<double> values = {0.0, 2.0, -2.0};
Sortie attendue :
std::vector<double> expected = {0.5, 0.880797, 0.119203};
Entrée :
string name = "sigmoid";
double[] values = new double[] {0.0, 2.0, -2.0};
Sortie attendue :
double[] expected = new double[] {0.5, 0.880797, 0.119203};
Explication
sigmoid(0) = 1 / (1 + 1) = 0.5, sigmoid(2) ≈ 0.880797 et sigmoid(-2) ≈ 0.119203. La sigmoïde ramène n'importe quel nombre entre 0 et 1.
Entrée :
name = "relu"
values = [-1.5, 0.0, 3.0]
Sortie attendue :
expected = [0.0, 0.0, 3.0]
Entrée :
std::string name = "relu";
std::vector<double> values = {-1.5, 0.0, 3.0};
Sortie attendue :
std::vector<double> expected = {0.0, 0.0, 3.0};
Entrée :
string name = "relu";
double[] values = new double[] {-1.5, 0.0, 3.0};
Sortie attendue :
double[] expected = new double[] {0.0, 0.0, 3.0};
Explication
ReLU garde les valeurs positives et remplace les valeurs négatives par 0 : [0, 0, 3].
Références
Ce défi a été adapté pour CodeUtility. Suivez l'énoncé et les contraintes ci-dessus.