Tous les défis
Moyen 0 résolus 0 % de réussite

Propagation avant dans un réseau à deux couches

Faites passer les entrées dans une couche cachée ReLU puis une couche de sortie sigmoïde.

Ce que vous allez apprendre

  • Enchaîner une couche cachée et une couche de sortie
  • Transmettre la sortie d'une couche à la suivante
  • Exécuter une prédiction complète du réseau

Problème

Un petit réseau de neurones a une couche cachée et une couche de sortie. Les données les traversent l'une après l'autre :

  1. Couche cachée : h_j = ReLU(inputs · hidden_weights[j] + hidden_biases[j]), où ReLU(z) = max(0, z)
  2. Couche de sortie : y_k = sigmoid(h · output_weights[k] + output_biases[k]), où sigmoid(z) = 1 / (1 + e^(-z))

Implémentez forward_pass(inputs, hidden_weights, hidden_biases, output_weights, output_biases).

Entrée

inputs : les n valeurs d'entrée.

hidden_weights, hidden_biases : la couche cachée, une ligne et un biais par neurone caché.

output_weights, output_biases : la couche de sortie, une ligne et un biais par sortie ; chaque ligne a un poids par neurone caché.

Sortie

Renvoyez la liste des sorties y du réseau.

Contraintes

1 ≤ entrées, neurones cachés, sorties ≤ 50

-10 ≤ chaque valeur ≤ 10

Exemples

Exemple 1
Entrée :
inputs = [1.0, 0.5]
hidden_biases = [0.0, 0.5]
output_biases = [0.0]
hidden_weights = [
    [1.0, -2.0],
    [0.5, 1.0]
]
output_weights = [
    [1.0, -1.0]
]

Sortie attendue :
expected = [0.182426]
Entrée :
std::vector<double> inputs = {1.0, 0.5};
std::vector<double> hidden_biases = {0.0, 0.5};
std::vector<double> output_biases = {0.0};
std::vector<std::vector<double>> hidden_weights = {
    {1.0, -2.0},
    {0.5, 1.0}
};
std::vector<std::vector<double>> output_weights = {
    {1.0, -1.0}
};

Sortie attendue :
std::vector<double> expected = {0.182426};
Entrée :
double[] inputs = new double[] {1.0, 0.5};
double[] hidden_biases = new double[] {0.0, 0.5};
double[] output_biases = new double[] {0.0};
double[][] hidden_weights = new double[][] {
    new double[] {1.0, -2.0},
    new double[] {0.5, 1.0}
};
double[][] output_weights = new double[][] {
    new double[] {1.0, -1.0}
};

Sortie attendue :
double[] expected = new double[] {0.182426};

Explication

Couche cachée : ReLU(1×1 + 0.5×(-2) + 0) = ReLU(0) = 0 et ReLU(1×0.5 + 0.5×1 + 0.5) = 1.5. Sortie : sigmoid(0×1 + 1.5×(-1) + 0) = sigmoid(-1.5) ≈ 0.182426.

Exemple 2
Entrée :
inputs = [2.0]
hidden_biases = [0.0, 0.0]
output_biases = [-1.0, 0.0]
hidden_weights = [
    [1.0],
    [-1.0]
]
output_weights = [
    [0.5, 0.5],
    [-0.5, 2.0]
]

Sortie attendue :
expected = [0.5, 0.268941]
Entrée :
std::vector<double> inputs = {2.0};
std::vector<double> hidden_biases = {0.0, 0.0};
std::vector<double> output_biases = {-1.0, 0.0};
std::vector<std::vector<double>> hidden_weights = {
    {1.0},
    {-1.0}
};
std::vector<std::vector<double>> output_weights = {
    {0.5, 0.5},
    {-0.5, 2.0}
};

Sortie attendue :
std::vector<double> expected = {0.5, 0.268941};
Entrée :
double[] inputs = new double[] {2.0};
double[] hidden_biases = new double[] {0.0, 0.0};
double[] output_biases = new double[] {-1.0, 0.0};
double[][] hidden_weights = new double[][] {
    new double[] {1.0},
    new double[] {-1.0}
};
double[][] output_weights = new double[][] {
    new double[] {0.5, 0.5},
    new double[] {-0.5, 2.0}
};

Sortie attendue :
double[] expected = new double[] {0.5, 0.268941};

Explication

Couche cachée : ReLU(2) = 2 et ReLU(-2) = 0. Sortie 1 : sigmoid(2×0.5 + 0 - 1) = sigmoid(0) = 0.5. Sortie 2 : sigmoid(2×(-0.5) + 0) = sigmoid(-1) ≈ 0.268941.

Références

Ce défi a été adapté pour CodeUtility. Suivez l'énoncé et les contraintes ci-dessus.

Apprenez des autres

Solutions de la communauté

Aucune solution publiée pour l'instant. Résolvez ce défi pour partager la première.