Cálculo en bucle de la salida de la red

Hemos visto que el procedimiento para obtener la salida de la red es bastante repetitivo: para cada capa tenemos que considerar la salida de la capa anterior, multiplicar la matriz de pesos y dicha matriz de valores de entrada, sumar la matriz de bias y aplicar al resultado la función de activación de que se trate (en nuestro caso la función sigmoide).

Si conocemos las matrices de pesos, de bias y la matriz de valores de entrada a la red, podemos recurrir a un bucle para realizar estos cálculos en secuencia.

Para esto, creemos una lista formada por las matrices de pesos:

W = [W1, W2, W3]
W

[array([[ 2,  1],
        [-3,  4],
        [-2,  5]]),
 array([[ 3,  1, -2],
        [-3, -2,  2],
        [ 1,  1,  2],
        [-1,  3,  3]]),
 array([[-3,  2, -1,  1]])]

...una lista formada por las matrices de bias:

b = [b1, b2, b3]
b

[array([[-1],
        [ 0],
        [ 3]]),
 array([[ 0],
        [ 1],
        [-2],
        [ 2]]),
 array([[1]])]

...y llevemos los valores de entrada a una matriz a la que llamamos x:

x = np.array([3, 1]).reshape(2, 1)
x

array([[3],
       [1]])

Ahora basta con repetir en bucle las operaciones indicadas:

num_layers = 3
for layer in range(num_layers):
    x = sigmoid(W[layer].dot(x) + b[layer])

x

array([[0.46141593]])

Como vemos, la variable x contiene inicialmente la matriz de valores de entrada (matriz a la que hemos llamado x1 en las secciones anteriores) y dentro del bucle se realiza el cálculo de los valores de salida considerando los pesos y bias de la capa que ocupa el índice "layer". El resultado (la salida de dicha capa) se vuelve a asignar a la variable x, que sirve de "capa de entrada" para la capa considerada en la siguiente iteración. El valor de x a la salida del bucle es exactamente la salida de la red neuronal.