Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.
| Beide Seiten, vorherige Überarbeitung Vorherige Überarbeitung Nächste Überarbeitung | Vorherige Überarbeitung | ||
| talit:neuronale_netze_kurs [2024-06-30 22:51] – [Aufgabe 2] sca | talit:neuronale_netze_kurs [2025-07-02 11:00] (aktuell) – [1. Plan] hof | ||
|---|---|---|---|
| Zeile 21: | Zeile 21: | ||
| |MI Morgen| Recap: Neuronale Netze Programmieren | | |MI Morgen| Recap: Neuronale Netze Programmieren | | ||
| |:::| weiter an Aufgaben | | |:::| weiter an Aufgaben | | ||
| - | |MI Nachmittag| | + | |MI Nachmittag| |
| |DO Morgen| weiter an Aufgaben | | |DO Morgen| weiter an Aufgaben | | ||
| |DO Nachmittag| Buffer | | |DO Nachmittag| Buffer | | ||
| Zeile 38: | Zeile 38: | ||
| * {{ : | * {{ : | ||
| + | ==== Repos ==== | ||
| + | <nodisp 1> | ||
| + | ++++Hide| | ||
| + | * [[https:// | ||
| + | ++++ | ||
| + | </ | ||
| ===== - Aufgaben ===== | ===== - Aufgaben ===== | ||
| - | Erstelle **GitHub-Repo** z.B. mit Namen "neural_networks". Lege alle deine Code-Files hier drin ab. Committe und pushe regelmässig. | + | Erstelle **GitHub-Repo** z.B. mit Namen "talit\_neural\_networks". Lege alle deine Code-Files hier drin ab. Committe und pushe regelmässig. |
| Aufgaben: Siehe Slides | Aufgaben: Siehe Slides | ||
| Zeile 63: | Zeile 68: | ||
| **Tipps:** | **Tipps:** | ||
| - | * CSV-File einlesen: | + | * **CSV-File einlesen:** |
| <code python> | <code python> | ||
| Zeile 82: | Zeile 87: | ||
| * Achtung: Liest man File ein, werden Zahlen typischerweise als Text interpretiert. Daher muss man diese noch in ints umwandeln. Mit *List Comprehensions* geht dies sehr einfach. | * Achtung: Liest man File ein, werden Zahlen typischerweise als Text interpretiert. Daher muss man diese noch in ints umwandeln. Mit *List Comprehensions* geht dies sehr einfach. | ||
| + | |||
| + | * **Numpy-Arrays in File speichern und laden** (z.B. Liste mit Gewichtsmatrizen): | ||
| + | |||
| + | <code python> | ||
| + | import numpy as np | ||
| + | |||
| + | # SAVE LIST OF NP ARRAYS | ||
| + | array_list = [np.array([1, | ||
| + | object_array = np.array(array_list, | ||
| + | np.save(' | ||
| + | |||
| + | # LOAD INTO LIST OF NP ARRAYS | ||
| + | loaded_array_list = np.load(' | ||
| + | loaded_array_list = list(loaded_array_list) | ||
| + | </ | ||
| ==== Aufgabe 2 ==== | ==== Aufgabe 2 ==== | ||
| - | <color red>test</ | + | <nodisp 2> |
| + | ++++2024| | ||
| + | <color red>**Bemerkung für 2024**: Leider hatten wir keine Zeit, die **objektorientierte Programmierung (OOP)** zu behandeln. Recherchiere deshalb selbst kurz dazu im Internet oder studiere ein passendes Video, z.B.:</ | ||
| + | |||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | |||
| + | ++++ | ||
| + | </ | ||
| + | |||
| + | Auftrag: | ||
| * **Ziel: Grundgerüst für ein neuronales Netzwerk objektorientiert programmieren** | * **Ziel: Grundgerüst für ein neuronales Netzwerk objektorientiert programmieren** | ||
| Zeile 100: | Zeile 130: | ||
| * Die Klasse hat eine Methode `feedforward`. Dieser wird als Argument ein Input-Array übergeben. Diesen ‘feeded’ sie dann ‘forward’ und berechnet den zugehörigen Output. | * Die Klasse hat eine Methode `feedforward`. Dieser wird als Argument ein Input-Array übergeben. Diesen ‘feeded’ sie dann ‘forward’ und berechnet den zugehörigen Output. | ||
| * Die Klasse hat eine Methode `test`. Dieser kann man als Argument einen Datensatz übergeben, der dann durch das NN gefüttert wird. Es wird die Erfolgsquote zurückgegeben: | * Die Klasse hat eine Methode `test`. Dieser kann man als Argument einen Datensatz übergeben, der dann durch das NN gefüttert wird. Es wird die Erfolgsquote zurückgegeben: | ||
| - | * Lade sowohl die Daten des Toy-Problems wie auch die MNIST Daten ein. Erstelle je ein Neuronales Netz (Anzahl Neuronen pro Layer richtig wählen) und teste mit der `test` Methode, wie gut dein NN funktioniert. | + | * Lade sowohl die Daten des Toy-Problems wie auch die MNIST Daten ein. Erstelle je ein Neuronales Netz (Anzahl Neuronen pro Layer richtig wählen) und teste mit der `test` Methode, wie gut dein NN funktioniert. |
| * Tipp: Da die Gewichtsmatrizen zufällig erzeugt werden, sollte also bei unserem Toy-Problem eine Erfolgsquote von etwa 50% resultieren. | * Tipp: Da die Gewichtsmatrizen zufällig erzeugt werden, sollte also bei unserem Toy-Problem eine Erfolgsquote von etwa 50% resultieren. | ||
| * Besprich deine Lösung mit dem Lehrer. | * Besprich deine Lösung mit dem Lehrer. | ||
| + | \\ | ||
| + | <code python> | ||
| + | # Stuktur: | ||
| + | class Network: | ||
| + | def __init__(self, | ||
| + | # ... | ||
| + | |||
| + | def feedforward(self, | ||
| + | # ... | ||
| + | |||
| + | def test(self, data_list): | ||
| + | # ... | ||
| + | |||
| + | # Erstelle ein Netzwerk für das Toy-Problem: | ||
| + | toy_net = Network(4, 3, 2) | ||
| + | |||
| + | # Erstelle ein Netzwerk für den Mnist-Datensatz: | ||
| + | mnist_net = Network(784, | ||
| + | </ | ||
| ==== Aufgabe 3 ==== | ==== Aufgabe 3 ==== | ||
| * **Ziel: NN für Toy-Problem trainieren** | * **Ziel: NN für Toy-Problem trainieren** | ||
| - | * Mache eine Kopie des Files `02_feedforward_oop.py` und speichere diese unter dem Namen `03_toyproblem_training.py` (resp. `< | + | * Mache eine Kopie des Files `02_feedforward_oop.py` und speichere diese unter dem Namen `03_toy_problem_training.py` (resp. `< |
| * Kommentiere alles, was mit dem MNIST-Datensatz zu tun hat, aus. Für den Moment wollen wir uns nur um das Toy-Problem kümmern. | * Kommentiere alles, was mit dem MNIST-Datensatz zu tun hat, aus. Für den Moment wollen wir uns nur um das Toy-Problem kümmern. | ||
| * Erweitere deine Network-Klasse um das Attribut `learning_rate`. Ein Wert für diese soll als Argument für die `__init__`-Methode übergeben werden, wenn ein `Network`-Objekt erstellt wird. | * Erweitere deine Network-Klasse um das Attribut `learning_rate`. Ein Wert für diese soll als Argument für die `__init__`-Methode übergeben werden, wenn ein `Network`-Objekt erstellt wird. | ||
| Zeile 118: | Zeile 167: | ||
| * Besprich deine Lösung mit dem Lehrer. | * Besprich deine Lösung mit dem Lehrer. | ||
| + | <code python> | ||
| + | # Stuktur: | ||
| + | class Network: | ||
| + | def __init__(self, | ||
| + | # Variablen für Anz. Neuronen definieren | ||
| + | # Gewichtsmatrizen erzeugen (zufällige Werte) | ||
| + | |||
| + | def feedforward(self, | ||
| + | # hidden Layer h aus Eingangswerten x und Gewichtsmatrix wA berechnen. | ||
| + | # output Layer y aus Ausgangswerten y und Gewichtsmatrix wB berechnen. | ||
| + | # beides (h und y) zurückgeben. | ||
| + | |||
| + | def test(self, data_list): | ||
| + | # data_list Zeile für Zeile durchgehen: | ||
| + | # Target-Wert auslesen und Target-Vektor erstellen, | ||
| + | # Einangswerte auslesen und Eingangs-Vektor erstellen. --> read_data | ||
| + | # Hidden- und Output-Werte aus Eingangswerten berechnen --> feedforward | ||
| + | # Ausgangswert mit Eingangswert vergleichen, | ||
| + | # Erfolgsquote zurückgeben. | ||
| + | def train(self, data_list): | ||
| + | # data_list Zeile für Zeile durchgehen: | ||
| + | # Target-Wert auslesen und Target-Vektor erstellen, | ||
| + | # Einangswerte auslesen und Eingangs-Vektor erstellen. --> read_data | ||
| + | # Hidden- und Output-Werte aus Eingangswerten berechnen --> feedforward | ||
| + | # Fehler auf Output-Layer berechnenen (Target - Output) | ||
| + | # Fehler auf Hidden-Layer berechnen | ||
| + | # Gewichtsmatrizen wA und WB aktualisieren (siehe Folie " | ||
| + | |||
| + | # Erstelle ein Netzwerk für das Toy-Problem: | ||
| + | toy_net = Network(4, 3, 2) | ||
| + | # Datenliste aus CSV auslesen und: | ||
| + | # Testen (Erfolg für Toy-Problem ca. 50 %) | ||
| + | # Trainieren | ||
| + | # Testen (Erfolg hoffentlich ca. 90 %) | ||
| + | </ | ||
| ==== Aufgabe 4 ==== | ==== Aufgabe 4 ==== | ||