Neuronales Netzwerk

Code-Stücke können hier veröffentlicht werden.
Antworten
Bigdriver1844
User
Beiträge: 1
Registriert: Mittwoch 25. Oktober 2017, 13:45

Mittwoch 25. Oktober 2017, 14:28

Hallo,

ich hatte mich mal an die Arbeit gemacht Klassen für ein Neuronales Netzwerk zu schreiben:

Code: Alles auswählen

from random import uniform
class inputneuron():
    Value = 0
    def setvalue(self,Value): # Setzt den Eingabewert
        self.Value = Value
    def getvalue(self): #Fragt den Eingabewert ab
        return self.Value

class workingneuron():
    Inputs = []
    Weights = []
    def setweights(self,*Weights): #Setzt eine Liste von Gewichten aus einer übergebenen Liste
        self.Weights = Weights
    def setinputs(self,*Inputs): #Setzt die zu verarbeitenden Eingaben
        self.Inputs = Inputs
    def resetinputs(self): #Setzt die Eingaben zurück
        self.Inputs = []
    def summarizeinput(self): #Multipliziert die Eingaben mit den entsprechenden Gewichten und addiert die Ergebnisse
        if len(self.Weights) >= len(self.Inputs):
            Count = 0
            Sum = 0
            for Input in self.Inputs:
                Sum += Input * self.Weights[Count]
                Count += 1
            return Sum
        else:
            return 0
    def calculateoutput(self): # Berechnet den Ausgabewert
        Value = self.summarizeinput()
        Output = 1/(1+(2.7182818285**(-(Value))))
        self.resetinputs()
        return Output

class neuralnetwork():
    Layer1 = []
    Values1 = []
    Layer2 = []
    Values2 = []
    Layer3 = []
    Values3 = []
    def initialize(self): #Initialisiert die Netzwerk-Ebenen
        Count = 0
        while Count < 8:
            self.Layer1.append(inputneuron()) # 1. Ebene
            Count += 1

        self.Layer2.append(workingneuron())
        self.Layer2.append(workingneuron()) # 2. Ebene

        self.Layer3.append(workingneuron()) # 3. Ebene

        self.Layer2[0].setweights([uniform(-25.0,25.0),uniform(-25.0,25.0),uniform(-25.0,25.0),uniform(-25.0,25.0)]) # Setzt die Gewichte für Ebene 2
        self.Layer2[1].setweights([uniform(-25.0,25.0),uniform(-25.0,25.0),uniform(-25.0,25.0),uniform(-25.0,25.0)])
        self.Layer3[0].setweights([uniform(-25.0,25.0),uniform(-25.0,25.0)]) # Setzt die Gewichte für Ebene 3

    def collectvalues1(self): # Fragt die Ergebnisse der EingabeNeuronen ab und liefert eine Liste zurück
        Values = []
        for Neuron in self.Layer1:
            Values.append(Neuron.getvalue())
        return Values
    def collectvalues2(self): # Fragt die Ergebnisse von Ebene 2 ab und liefert eine Liste zurück
        Values = []
        for Neuron in self.Layer2:
            Values.append(Neuron.calculateoutput())
        return Values
    def collectvalues3(self): # Fragt (die) das Ergebnis von Ebene 3 ab und liefert eine Liste zurück
        Values = []
        for Neuron in self.Layer1:
            Values.append(Neuron.calculateoutput())
        return Values
    def calculateoutput(self,*Input):Berechnet den Ausgabewert des Neuronalen Netzwerks
        Count = 0
        for Neuron in self.Layer1:
            Neuron.setvalue(Input[Count])
            Count += 1
        self.Values1 = self.collectvalues1
        for Neuron in self.Layer2:
            Neuron.resetinputs()
            Neuron.setinputs(self.Values1)
        self.Values2 = self.collectvalues2
        for Neuron in self.Layer3:
            Neuron.resetinputs()
            Neuron.setinputs(self.Values2)
        self.Values3 = self.collectvalues3
        return self.Values3[0]

NN1 = neuralnetwork()
NN1.initialize()
print(NN1.calculateoutput([4,3,6,7,9,3,1,5]))
Ich habe nun das Problem, dass ich immer einen Fehler in Zeile 74 bekomme:
Traceback (most recent call last):
File "C:\Users\herbert\Documents\Programme\NN\classes.py", line 89, in <module>
print(NN1.calculateoutput([4,3,6,7,9,3,1,5]))
File "C:\Users\herbert\Documents\Programme\NN\classes.py", line 74, in calculateoutput
Neuron.setvalue(Input[Count])
IndexError: tuple index out of range
Hat jemand einen Lösungsansatz?

Danke im Voraus
Peter
__deets__
User
Beiträge: 3111
Registriert: Mittwoch 14. Oktober 2015, 14:29

Mittwoch 25. Oktober 2017, 15:23

Bitte gleich mal den Rückwärtsgang einlegen und eine der wichtigsten Grundlagen der OO-Programmierung in Python verinnerlichen: das was du damit den Listen direkt unterhalb des class-statements machst ist garantiert nicht, was du denkst was du machst. Das sind Listen die sich ALLE Instanzen einer Klasse teilen. Falls du Java kennst: das ist in etwa wie static Deklarationen. Das willst du bestimmt nicht. Zur Anlage von Instanzattributen dient der Konstruktor __init__.

Auch hast du viele unnötige setter, getter und resetter. In Python greift man in diesem Fall einfach direkt auf die Attribute zu. Ganz generell wäre ein Blick auf PEP8 zur richtigen Schreibe von Python empfehlenswert. Denn dein Code ist so sehr, sehr schwer für andere zu lesen.

Zum iterieren über Elemente einer Liste mit einem gleichzeitig mitgeführten Counter nutzt man enumerate

Code: Alles auswählen

for index, element in enumerate(sequenz):
     ...
Dein eigentlicher Fehler kommt durch den Zugriff mittels Index. Du hast halt einen zu großen Index für das Tupel auf das du in der Zeile zugreifst.

Last but noch least: es gibt eine Vielzahl von hochoptimierten (bis hin zu GPU Nutzung ) NN-Implementierungen die du in Python nutzen kannst. Falls das Ziel mehr als nur die persönliche Bildung ist.
Antworten