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.