I mit 3 Eingängen, ein einfaches Perceptron bin den Aufbau (x, y, Bias = 1)Neural Network: A Perceptron für die Position eines Punktes relativ zu einem Funktions Erraten
Er muß den gegebenen Punkt erraten, ob (x , y) ist unter oder unter eine bestimmte Funktion.
Grundsätzlich ist es von this article
Ein betreuter Lernmodell inspiriert wurde verwendet, um das Netzwerk zu trainieren und die Formel ist die folgende:
learningConst = 0.01
error = desired - neuralAnswer
new_weights[i] = old_weights[i] + error * inputs[i] * learningConst
Noch nach Tests Ausbildung macht es Fehler auch auf eine einfache Funktion (2x + 1)
Hier ist der Code:
import numpy as np
import matplotlib.pyplot as plt
class Perceptron:
def __init__(self, n):
self.n = n #n is 2 in this case. 2 inputs [ x, y ]
self.weights = [np.random.uniform(-1, 1) for x in range(n)]
self.learningConstant = 0.05
# 1 added to the sum is the bias input
def feedForward(self, inputs):
return 1 + sum([self.weights[i]*inputs[i] for i in range(self.n)])
def activate(self, result):
if result >= 0:
return 1
elif result < 0:
return -1
def train(self, inputs, expected):
prediction = self.feedForward(inputs)
answer = self.activate(prediction)
error = expected - answer
self.weights = [
self.weights[i] + error * inputs[i] * self.learningConstant
for i in range(self.n)
]
#print(self.weights)
def predict(self, inputs):
prediction = self.feedForward(inputs)
return self.activate(prediction)
Sie können hier die Ergebnisse sehen. Grüne Farbe zeigt an, dass das Perzeptron es richtig erkannt hat und die roten zeigen die Fehler an. Lustige Sache - es neigt dazu, auf Punkte unterhalb der Linie zu verwechseln.
Was soll ich tun, um das Programm zu verbessern?
der vollständige Code: CLICK
SOLUTION
Mein Problem der Bias-Eingang als Brute-Konstante (Linie 14 des vollständigen Code) unter Verwendung von ohne dass der Algorithmus, um darauf zu lernen. Also sind meine Eingaben jetzt [bias, x, y] und die Gewichte sind [w1, w3, w3] - der Bias-Eingang hat nun sein Gewicht.
Eine andere gute Idee ist, die Gewichte irgendwo anders zu speichern, so dass der Algorithmus nicht bei jedem Test des Programms neu beginnen muss.
Ich sehe nicht den Punkt der Verwendung von 'numpy' nur um Zufallszahlen zu erzeugen ... benutze numpy Arrays und Vektoroperationen:' self.weights = np.random.uniform (-1, 1, size = n) 'und auch' np.sum (self.weights * inputs) 'und' self.weights = self.weights + error * inputs * self.learningConstant'. – Bakuriu
Kannst du bitte den Code posten, der auch dein 'Perceptron' benutzt, damit ich es nicht machen muss :) – bakkal