Neuronale Netze

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
Kwauka
User
Beiträge: 3
Registriert: Dienstag 21. Mai 2024, 15:44

Ich beschäftige mich gerade mit Neuronalen Netzen und komme bei einer Anweisung nicht weiter, ich habe eine Anweisung

targets[int(zeileListe[0])] = 1

das verstehe ich nicht! Es stammt aus einem Buch, und der Autore schreibt dazu:
Der Inhalt von zeileListe[0] ist die erste Zahl eines csv-Datensatzes. Es ist die Ziffer, die durch das Bild dargestellt werden soll. Diese Ziffer wird nun als Index verwendet. Damit sie als Index taugt, muss sie noch mit int() in eine ganze Zahl überführt werden. Der Ausgabewert, der die Target-Ziffer repräsentiert, wird nun auf 1 gesetzt. Falls z.B. die Ziffer 4 lautet, ist der Inhalt von targets nun: [0. 0. 0. 0. 1. 0. 0. 0. 0. 0.]
Das Programm dazu sieht folgedermaßen aus:

Code: Alles auswählen

import numpy as np
import math

EPOCHEN = 1       # Anzahl Trainingsdurchläufe
LR = 0.1          # Lernrate
I_KNOTEN = 784    # Anzahl Eingabeknoten
H_KNOTEN = 100    # Anzahl verborgene Knoten
O_KNOTEN = 10     # Anzahl Ausgabeknoten
PFAD_TRAINING = 'daten/mnist_train.csv'  # Pfad zu Traingsdaten
PFAD_TEST = 'daten/mnist_test.csv'       # Pfad zu Testdaten

# Initialisierung des neuronalen Netzes
wih = np.random.rand(H_KNOTEN, I_KNOTEN) - 0.5
who = np.random.rand(O_KNOTEN, H_KNOTEN) - 0.5

def sig(x):
    return 1 / (1 + math.e **-x)

def datenLesen(pfad):
    """ Etikettierte Daten werden aus der csv-Datei mit dem
        Pfad pfad gelesen. Daraus wird eine Liste
        mit Tupeln aus Numpy-Arrays (i, t)
        erzeugt und zurückgegeben."""
    stream = open(pfad, 'r')
    datenliste = stream.readlines()
    stream.close()
    daten = []   
    for zeile in datenliste:
        zeileListe = zeile.split(',')
        #print("ZeileListe\t",zeileListe)
        # Eingaben aus dem Datensatz extrahieren und skalieren
        eingaben = np.array(zeileListe[1:], dtype=float)
        #print("Eingaben\t",eingaben)
        eingabenSkaliert = (eingaben / 255 * 0.99) + 0.01
        targets = np.zeros(O_KNOTEN)
        #print("Targets\t",targets)
        targets[int(zeileListe[0])] = 1
              
        i = np.array(eingabenSkaliert, ndmin=2).T
        t = np.array(targets, ndmin=2).T
        daten.append((i, t))
    return daten
       
def trainieren(i, t):
    global wih, who      
    xh = np.dot(wih, i)
    yh = sig(xh)      
    xo = np.dot(who, yh)
    o = sig(xo)     
    eo = t - o  
    eh = np.dot(who.T, eo)   
    who += LR * np.dot((eo * o * (1.0 - o)), yh.T)  
    wih += LR * np.dot((eh * yh * (1.0 - yh)), i.T)

def vorhersagen(i):
    xh = np.dot(wih, i)
    yh = sig(xh)        
    xo = np.dot(who, yh)
    o = sig(xo)
    return o

# Neuronales Netz trainieren
for ep in range(EPOCHEN):
    daten = datenLesen(PFAD_TRAINING)
    for i, t in daten:
        trainieren(i, t)
    
# Neuronales Netz testen
testbericht = []    # liste aus 0 (falsches Ergebnis) und 1 (richtiges Ergebnis)
testdaten = datenLesen(PFAD_TRAINING)
for i, t in testdaten:
    o = vorhersagen(i)
    ziffer = np.argmax(o)                                
    erwarteteZiffer = np.argmax(t)                      
    if (ziffer == erwarteteZiffer):                     

        testbericht.append(1)
    else:
        testbericht.append(0)
print(o)

trefferquote = sum(testbericht) / len(testbericht) 
print ('Trefferquote:',trefferquote * 100, '%')
input()
Kann mit jemand dazu einen Tipp geben, wie das zu verstehen ist. Ich weiß das "targets ein array mit 10 Spalten ist, die alle mit 0 initialisiert wurden. Siehe "targets = np.zeros(O_KNOTEN)"!
Mit der Anweisung wird die 1. Zahl aus einer CSV-Datei gelesen, und diese soll nun als Index verwendet werden, bloß wie?

Vielen Dank für eure Hilfe in voraus.

Reinhold Kwauka
Benutzeravatar
__blackjack__
User
Beiträge: 13565
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Kwauka: Ich verstehe nicht so ganz was Du nicht verstehst‽ *Wie* steht doch da, mit Beispiel wie das Ergebnis aussieht wenn die erste Ziffer dieser Zahl den Wert 4 hat. Hast Du das Grundlagentutorial in der Python-Dokumentation schon durchgearbeitet? Listen, beziehungsweise (veränderbare) Sequenzen allgemein, und Zuweisungen an einen Index sind Grundlagen. Numpy-Arrays verhalten sich da teilweise etwas anders/können mit mehr Werten/Datentypen als Index umgehen als einfachen, ganzen Zahlen, aber bei eben jenen verhalten die sich wie Listen.
„Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.“ — Brian W. Kernighan
Antworten