Porta XOR da rede neural não está aprendendo

Estou tentando criar um portão XOR usando a rede 2 perceptron, mas por algum motivo a rede não está aprendendo, quando planto a alteração do erro em um gráfico, o erro chega a um nível estático e oscila nessa região.

Eu não adicionei nenhum viés à rede no momento.

import numpy as np

def S(x):
    return 1/(1+np.exp(-x))

win = np.random.randn(2,2)
wout = np.random.randn(2,1)
eta = 0.15

# win = [[1,1], [2,2]]
# wout = [[1],[2]]

obj = [[0,0],[1,0],[0,1],[1,1]]
target = [0,1,1,0]

epoch = int(10000)
emajor = ""

for r in range(0,epoch):
    for xy in range(len(target)):
        tar = target[xy]
        fdata = obj[xy]

        fdata = S(np.dot(1,fdata))

        hnw = np.dot(fdata,win)

        hnw = S(np.dot(fdata,win))

        out = np.dot(hnw,wout)

        out = S(out)

        diff = tar-out

        E = 0.5 * np.power(diff,2)
        emajor += str(E[0]) + ",\n"

        delta_out = (out-tar)*(out*(1-out))
        nindelta_out = delta_out * eta

        wout_change = np.dot(nindelta_out[0], hnw)

        for x in range(len(wout_change)):
            change = wout_change[x]
            wout[x] -= change

        delta_in = np.dot(hnw,(1-hnw)) * np.dot(delta_out[0], wout)
        nindelta_in = eta * delta_in

        for x in range(len(nindelta_in)):
            midway = np.dot(nindelta_in[x][0], fdata)
            for y in range(len(win)):
                win[y][x] -= midway[y]



f = open('xor.csv','w')
f.write(emajor) # python will convert \n to os.linesep
f.close() # you can omit in most cases as the destructor will call it

Esse é o erro que muda pelo número de rodadas de aprendizado. Isso está correto? A linha de cor vermelha é a linha que eu esperava como o erro deveria mudar.

Algo errado que estou fazendo no código? Como não consigo descobrir o que está causando o erro. Ajuda muito apreciada.

desde já, obrigado

questionAnswers(2)

yourAnswerToTheQuestion