Ich habe das folgende neuronale Netzwerk implementiert, um das XOR-Problem in Python zu lösen. Mein neuronales Netzwerk besteht aus einer Eingangsschicht von 2 Neuronen, einer versteckten Schicht von 2 Neuronen und einer Ausgangsschicht von 1 Neuron. Ich verwende die Sigmoid-Funktion als Aktivierungsfunktion für die verborgene Schicht und die linearen (Identität) Funktion als Aktivierungsfunktion für die Ausgangsschicht:XOR Neuronales Netzwerk konvergiert zu 0.5
import numpy as np
def sigmoid(z):
return 1/(1+np.exp(-z))
def s_prime(z):
return np.multiply(sigmoid(z), sigmoid(1.0-z))
def init_weights(layers, epsilon):
weights = []
for i in range(len(layers)-1):
w = np.random.rand(layers[i+1], layers[i]+1)
w = w * 2*epsilon - epsilon
weights.append(np.mat(w))
return weights
def fit(X, Y, w, predict=False, x=None):
w_grad = ([np.mat(np.zeros(np.shape(w[i])))
for i in range(len(w))])
for i in range(len(X)):
x = x if predict else X[0]
y = Y[0,i]
# forward propagate
a = x
a_s = []
for j in range(len(w)):
a = np.mat(np.append(1, a)).T
a_s.append(a)
z = w[j] * a
a = sigmoid(z)
if predict: return a
# backpropagate
delta = a - y.T
w_grad[-1] += delta * a_s[-1].T
for j in reversed(range(1, len(w))):
delta = np.multiply(w[j].T*delta, s_prime(a_s[j]))
w_grad[j-1] += (delta[1:] * a_s[j-1].T)
return [w_grad[i]/len(X) for i in range(len(w))]
def predict(x):
return fit(X, Y, w, True, x)
####
X = np.mat([[0,0],
[0,1],
[1,0],
[1,1]])
Y = np.mat([0,1,1,0])
layers = [2,2,1]
epochs = 10000
alpha = 0.5
w = init_weights(layers, 1)
for i in range(epochs):
w_grad = fit(X, Y, w)
print w_grad
for j in range(len(w)):
w[j] -= alpha * w_grad[j]
for i in range(len(X)):
x = X[i]
guess = predict(x)
print x, ":", guess
Die Backpropagation für alle scheint richtig zu sein; das einzige Problem, das mir in den Sinn kommt, wäre ein Problem mit meiner Implementierung der Bias-Einheiten. In jedem Fall konvergieren alle Vorhersagen für jede Eingabe bei jeder Ausführung des Codes auf etwa 0,5. Ich habe den Code durchforstet und kann nicht finden, was falsch ist. Kann irgendjemand auf meine Implementierung hinweisen? Ich freue mich über jede Rückmeldung.
Wenn aus irgendeinem Grund könnte es, hier ist die Art der Ausgabe erhalte ich helfen:
[[0 0]] : [[ 0.5]]
[[0 1]] : [[ 0.49483673]]
[[1 0]] : [[ 0.52006739]]
[[1 1]] : [[ 0.51610963]]
Eigentlich Code Sigmoidfunktion das Derivat kleines Problem, da 'g '(z) = a * (1-a) zu berechnen, bedeutet g Sigmoidfunktion, a = sigmoid (z) ', und Sie übergeben' a_s [j] 'an' s_prime() ', so sollte Ihr' s_prime() '' return np.multiply (z, 1.0-z) 'anstelle von' return np.multiply (Sigmoid (z), Sigmoid (1.0-z)) '. – Belter