Todos los desafíos
Intermedio 0 resueltos 0% de aceptación

Propagación hacia adelante en una red de dos capas

Pasa las entradas por una capa oculta ReLU y una capa de salida sigmoide.

Lo que aprenderás

  • Encadenar una capa oculta y una de salida
  • Pasar la salida de una capa a la siguiente
  • Ejecutar una predicción completa de la red

Problema

Ver original (inglés)

Una red neuronal pequeña tiene una capa oculta y una capa de salida. Los datos fluyen hacia adelante a través de ellas:

  1. Capa oculta: h_j = ReLU(inputs · hidden_weights[j] + hidden_biases[j]), donde ReLU(z) = max(0, z)
  2. Capa de salida: y_k = sigmoid(h · output_weights[k] + output_biases[k]), donde sigmoid(z) = 1 / (1 + e^(-z))

Implementa forward_pass(inputs, hidden_weights, hidden_biases, output_weights, output_biases).

Entrada

inputs: Los n valores de entrada.

hidden_weights, hidden_biases: La capa oculta, una fila y un sesgo por neurona oculta.

output_weights, output_biases: La capa de salida, una fila y un sesgo por salida; cada fila tiene un peso por neurona oculta.

Salida

Devuelve la lista de salidas y de la red.

Restricciones

1 ≤ entradas, neuronas ocultas, salidas ≤ 50

-10 ≤ cada valor ≤ 10

Ejemplos

Ejemplo 1
Entrada:
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]
]

Salida esperada:
expected = [0.182426]
Entrada:
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}
};

Salida esperada:
std::vector<double> expected = {0.182426};
Entrada:
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}
};

Salida esperada:
double[] expected = new double[] {0.182426};

Explicación

Capa oculta: ReLU(1×1 + 0.5×(-2) + 0) = ReLU(0) = 0 y ReLU(1×0.5 + 0.5×1 + 0.5) = 1.5. Salida: sigmoid(0×1 + 1.5×(-1) + 0) = sigmoid(-1.5) ≈ 0.182426.

Ejemplo 2
Entrada:
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]
]

Salida esperada:
expected = [0.5, 0.268941]
Entrada:
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}
};

Salida esperada:
std::vector<double> expected = {0.5, 0.268941};
Entrada:
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}
};

Salida esperada:
double[] expected = new double[] {0.5, 0.268941};

Explicación

Capa oculta: ReLU(2) = 2 y ReLU(-2) = 0. Salida 1: sigmoid(2×0.5 + 0 - 1) = sigmoid(0) = 0.5. Salida 2: sigmoid(2×(-0.5) + 0) = sigmoid(-1) ≈ 0.268941.

Cómo abordarlo

Inténtalo primero por tu cuenta y luego abre las pistas una a una.

Pista 1

Primero calcula todas las activaciones ocultas a partir de las entradas, y luego usa esas salidas ocultas para la capa final.

Pista 2

Cada capa es un conjunto de dot products más sesgos, con ReLU en la capa oculta y sigmoid en la salida.

Pista 3

No mezcles las entradas originales en la segunda capa; solo ve las salidas de la capa oculta.

Complejidad esperada

tiempo O(hn + oh), espacio extra O(h + o)

Referencias

Este reto está adaptado para CodeUtility. Sigue el enunciado y las restricciones indicadas arriba.

Aprende de otros

Soluciones de la comunidad

Aún no hay soluciones publicadas. Resuelve este reto para compartir la primera.