Implementación de Red Neuronal Artificial para Puerta Lógica XOR con Entrada Binaria de 2 bits

La Red Neural Artificial (ANN) es un modelo computacional basado en las redes neuronales biológicas de cerebros animales. ANN se modela con tres tipos de capas: una capa de entrada, capas ocultas (una o más) y una capa de salida. Cada capa comprende Nodes (como neuronas biológicas) que se denominan Neuronas Artificiales. Todos los Nodes están conectados con bordes ponderados (como las sinapsis en los cerebros biológicos) entre dos capas. Inicialmente, con la función de propagación directa, se predice la salida. Luego, a través de la retropropagación, el peso y el sesgo de los Nodes se actualizan para minimizar el error en la predicción para lograr la convergencia de la función de costo al determinar el resultado final. Tabla de verdad de la función lógica
XOR para variables binarias de 2 bits , es decir, el vector de entrada $\boldsymbol{x} : (\boldsymbol{x_{1}}, \boldsymbol{x_{2}})$ y la salida correspondiente  $\boldsymbol{y}$ – 
 

$\boldsymbol{x_{1}}$ $\boldsymbol{x_{2}}$ $\boldsymbol{y}$
0 0 0
0 1 1
1 0 1
1 1 0

Enfoque:  
Paso 1: Importe las bibliotecas de Python requeridas 
Paso 2: Defina la función de activación: Función sigmoide  Paso
3: Inicialice los parámetros de la red neuronal (pesos, sesgo) 
y defina los hiperparámetros del modelo (número de iteraciones, tasa de aprendizaje)  Paso
4: Propagación hacia adelante 
Paso 5: Propagación hacia atrás  Paso
6: Actualizar los parámetros de ponderación y sesgo 
Paso 7: entrenar el modelo de aprendizaje 
Paso 8: trazar el valor de pérdida frente a la época 
Paso 9: probar el rendimiento del modelo 
 

Implementación de Python: 
 

Python3

# import Python Libraries
import numpy as np
from matplotlib import pyplot as plt
 
# Sigmoid Function
def sigmoid(z):
    return 1 / (1 + np.exp(-z))
 
# Initialization of the neural network parameters
# Initialized all the weights in the range of between 0 and 1
# Bias values are initialized to 0
def initializeParameters(inputFeatures, neuronsInHiddenLayers, outputFeatures):
    W1 = np.random.randn(neuronsInHiddenLayers, inputFeatures)
    W2 = np.random.randn(outputFeatures, neuronsInHiddenLayers)
    b1 = np.zeros((neuronsInHiddenLayers, 1))
    b2 = np.zeros((outputFeatures, 1))
     
    parameters = {"W1" : W1, "b1": b1,
                  "W2" : W2, "b2": b2}
    return parameters
 
# Forward Propagation
def forwardPropagation(X, Y, parameters):
    m = X.shape[1]
    W1 = parameters["W1"]
    W2 = parameters["W2"]
    b1 = parameters["b1"]
    b2 = parameters["b2"]
 
    Z1 = np.dot(W1, X) + b1
    A1 = sigmoid(Z1)
    Z2 = np.dot(W2, A1) + b2
    A2 = sigmoid(Z2)
 
    cache = (Z1, A1, W1, b1, Z2, A2, W2, b2)
    logprobs = np.multiply(np.log(A2), Y) + np.multiply(np.log(1 - A2), (1 - Y))
    cost = -np.sum(logprobs) / m
    return cost, cache, A2
 
# Backward Propagation
def backwardPropagation(X, Y, cache):
    m = X.shape[1]
    (Z1, A1, W1, b1, Z2, A2, W2, b2) = cache
     
    dZ2 = A2 - Y
    dW2 = np.dot(dZ2, A1.T) / m
    db2 = np.sum(dZ2, axis = 1, keepdims = True)
     
    dA1 = np.dot(W2.T, dZ2)
    dZ1 = np.multiply(dA1, A1 * (1- A1))
    dW1 = np.dot(dZ1, X.T) / m
    db1 = np.sum(dZ1, axis = 1, keepdims = True) / m
     
    gradients = {"dZ2": dZ2, "dW2": dW2, "db2": db2,
                 "dZ1": dZ1, "dW1": dW1, "db1": db1}
    return gradients
 
# Updating the weights based on the negative gradients
def updateParameters(parameters, gradients, learningRate):
    parameters["W1"] = parameters["W1"] - learningRate * gradients["dW1"]
    parameters["W2"] = parameters["W2"] - learningRate * gradients["dW2"]
    parameters["b1"] = parameters["b1"] - learningRate * gradients["db1"]
    parameters["b2"] = parameters["b2"] - learningRate * gradients["db2"]
    return parameters
 
# Model to learn the XOR truth table
X = np.array([[0, 0, 1, 1], [0, 1, 0, 1]]) # XOR input
Y = np.array([[0, 1, 1, 0]]) # XOR output
 
# Define model parameters
neuronsInHiddenLayers = 2 # number of hidden layer neurons (2)
inputFeatures = X.shape[0] # number of input features (2)
outputFeatures = Y.shape[0] # number of output features (1)
parameters = initializeParameters(inputFeatures, neuronsInHiddenLayers, outputFeatures)
epoch = 100000
learningRate = 0.01
losses = np.zeros((epoch, 1))
 
for i in range(epoch):
    losses[i, 0], cache, A2 = forwardPropagation(X, Y, parameters)
    gradients = backwardPropagation(X, Y, cache)
    parameters = updateParameters(parameters, gradients, learningRate)
 
# Evaluating the performance
plt.figure()
plt.plot(losses)
plt.xlabel("EPOCHS")
plt.ylabel("Loss value")
plt.show()
 
# Testing
X = np.array([[1, 1, 0, 0], [0, 1, 0, 1]]) # XOR input
cost, _, A2 = forwardPropagation(X, Y, parameters)
prediction = (A2 > 0.5) * 1.0
# print(A2)
print(prediction)
Producción: 

 
[[ 1.  0.  0.  1.]]

 

Aquí, la salida predicha del modelo para cada una de las entradas de prueba coincide exactamente con la salida convencional de la puerta lógica XOR ( $\boldsymbol{y}$ ) de acuerdo con la tabla de verdad y la función de costo también converge continuamente. 
Por lo tanto, significa que la Red Neuronal Artificial para la puerta lógica XOR está correctamente implementada.
 

Publicación traducida automáticamente

Artículo escrito por goodday451999 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *