Я с нуля построил нейронную сеть, в которой веса, активации и дельты хранятся в массиве, и обучил ее проблеме 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))