具有 2 个输入的 XOR 逻辑门的反向传播算法

Backpropagation algorithm for an XOR logical gate with 2 inputs

提问人:ChevreFou 提问时间:10/24/2023 更新时间:10/24/2023 访问量:21

问:

我很难理解我的代码出了什么问题,也许我不明白反向传播是如何工作的。我能得到一些提示吗?

import numpy as np
import matplotlib.pyplot as plt


def sigmoide(x):
    y=1/(1+np.exp(-x))
    return y


def XOR(entradas,x):
    if entradas==2:
        y_d=np.array([-1,1,1,-1])
    elif entradas==4:
        y_d=np.array([0]) #a hacer despues
    ERRVEC=[]
    ITVEC=[]
    
    eta=1
    Err = 1
    max_iteracion=300
    iteracion=0
    
    #Initialisacion de pesos y bias
    w13=np.random.uniform(0,1)
    w24=np.random.uniform(0,1)
    w14=np.random.uniform(0,1)
    w23=np.random.uniform(0,1)
    
    w35=np.random.uniform(0,1)
    w45=np.random.uniform(0,1)
    
    b3=np.random.uniform(0,1) #Il y a un biais par neurone de couche (pas entrée)
    b4=np.random.uniform(0,1)
    b5=np.random.uniform(0,1)


    y_salida=np.zeros(len(y_d))
    while Err > 0 and iteracion<=max_iteracion:
        Err = 0
        permutacion = np.random.permutation(len(x))
        
        for idx in permutacion:
            xtemp = x[idx,:]
            xtemp=xtemp.reshape(-1, 1)
            
            #Por la entrada
            y3=sigmoide(w13*xtemp[0]+w23*xtemp[1]+b3)
            y4=sigmoide(w14*xtemp[0]+w24*xtemp[1]+b4)
            y5=sigmoide(w35*y3+w45*y4+b5)
            y=y5
            
            #backpropagation
            delta5=y*(1-y)*(y_d[idx] - y)
            delta3=y3*(1-y3)*w35*delta5
            delta4=y4*(1-y4)*w45*delta5
        
            w45+=eta*delta5*y4
            w35+=eta*delta5*y3
            
            w14+=eta*delta4*xtemp[0]
            w24+=eta*delta4*xtemp[1]
        
            w13+=eta*delta3*xtemp[0]
            w23+=eta*delta3*xtemp[1]
            
            b3+=eta*delta3
            b4+=eta*delta4
            b5+=eta*delta5
            
        #Determinar Error
        y_salida[idx]=y
        Err += 0.5 * ((y_d[idx] - y) ** 2) #Si y_d e y son lo mismo, va a terminar el codigo
        iteracion+=1

        ERRVEC.append(Err)
        ITVEC.append(iteracion)

        print(Err)
        print(iteracion)
        print(y_salida)
    return

x = np.array([[-1, -1],[1, -1],[-1, 1],[1, 1]])

XOR(2,x)

末尾的 y_salida 的值必须是:[-1,1,1,-1],这里 y_salida=[0,0,0,0]。

网络在所附图片中进行了示意图化。(https://i.stack.imgur.com/uRhTt.png)

目前,代码根本没有优化,它只是为了了解我的代码中出了什么问题,以及我错了反向传播算法的哪一部分。

Python 神经网络 XOR 反向传播

评论


答: 暂无答案