Нейронная сеть не возвращает правильные значения для XOR - PullRequest
0 голосов
/ 25 февраля 2020

Я с нуля построил нейронную сеть, в которой веса, активации и дельты хранятся в массиве, и обучил ее проблеме XOR, но она всегда дает неправильные результаты. Однако, когда я построил аналогичную сеть без использования массива, сеть выдает правильные результаты даже без скорости обучения

Это код для нейронной сети с проблемами. Я был бы признателен, если бы вы могли помочь мне исправить это.

import numpy as np

X = np.array((
    [0,0],
    [0,1],
    [1,0],
    [1,1]),dtype = float)

Y = np.array((
    [0],
    [1],
    [1],
    [0]),dtype = float)

class NeuralNetwork(object):
def __init__(self, layers,lr):
    self.layers = layers
    self.learningRate = lr

    self.weights = []
    self.activations = []

    for i in range(len(layers)-1):
        self.weights.append(np.random.randn(self.layers[i], self.layers[i+1]))

def sigmoid(self, x, deriv = False):
    if deriv == True:
        return x * (1-x)
    return 1/(1+np.exp(-x))

# def tanh(self, x, deriv = False):
#     if deriv == True:
#         return 1 - x*x
#     return np.tanh(x)

def feedForward(self,inputs):

    activatedInputs = inputs
    self.activations.append(activatedInputs)

    for i in range(len(self.weights)):
        dotProduct = activatedInputs.dot(self.weights[i])
        activatedInputs = self.sigmoid(dotProduct)
        self.activations.append(activatedInputs)

    outputs = self.activations[len(self.activations)-1]

    return outputs

def backPropagate(self, outputs, expectedOutputs):
    error = expectedOutputs - outputs
    deltas = []
    for i in range(len(self.weights)-1, -1, -1):
        delta = error * self.sigmoid(self.activations[i+1], deriv=True)
        deltas.append(delta)
        error = delta.dot(self.weights[i].T)
    deltas.reverse()

    for i in range(len(self.weights)):
        self.weights[i] += self.activations[i].T.dot(deltas[i]) * self.learningRate


def train(self, inputs, expectedOutputs):
    outputs = self.feedForward(inputs)
    self.backPropagate(outputs, expectedOutputs)

def predict(self, inputs):
    return self.feedForward(inputs)


NN = NeuralNetwork([2,3,5,2,1],0.1)

for i in range(1000):
    NN.train(X,Y)
print(NN.predict(X))

Это код для нейронной сети, которая работала (без массивов):

import numpy as np

X = np.array((
    [0,0],
    [0,1],
    [1,0],
    [1,1]),dtype = float)

Y = np.array((
    [0],
    [1],
    [1],
    [0]),dtype = float)

class NeuralNetwork(object):
    def __init__(self, inputs, hidden, outputs):
        self.inputs = inputs
        self.hidden = hidden
        self.outputs = outputs

    self.IH_Weights = np.random.randn(self.inputs, self.hidden)
    self.OH_Weights = np.random.randn(self.hidden, self.outputs)

def sigmoid(self, x, deriv = False):
    if deriv == True:
        return x * (1-x)
    return 1/(1+np.exp(-x)) 

def feedForward(self,inputs):
    inputDP = inputs.dot(self.IH_Weights)
    self.activatedHidden = self.sigmoid(inputDP)
    hiddenDP = self.activatedHidden.dot(self.OH_Weights)
    outputs = self.sigmoid(hiddenDP)
    return outputs

def backPropagate(self,inputs, outputs, expectedOutputs): 
    error = expectedOutputs - outputs
    outputDelta = error * self.sigmoid(outputs, deriv=True)

    hiddenError = outputDelta.dot(self.OH_Weights.T)
    hiddenDelta = hiddenError * self.sigmoid(self.activatedHidden, deriv=True)

    self.OH_Weights += self.activatedHidden.T.dot(outputDelta)
    self.IH_Weights += inputs.T.dot(hiddenDelta)


def train(self, inputs, expectedOutputs):
    outputs = self.feedForward(inputs)
    self.backPropagate(inputs, outputs, expectedOutputs)

def predict(self, inputs):
    return self.feedForward(inputs)



NN = NeuralNetwork(2,5,1)
for i in range(100000):
    NN.train(X,Y)

print(NN.predict(X))
...