Anfängerproblem beim trainieren eines neuronalen Netzes

mmtzh

Cadet 3rd Year
Registriert
Nov. 2014
Beiträge
62
Hallo zusammen,

ich versuche gerade zu lernen, wie ich neuronale Netze trainieren kann.
Ich habe mit zwei Varianten gestartet, die ich eigentlich als sehr einfach gehalten hätte.

Zum einen wollte ich einem neuronalen Netz ein UND-Gatter beibringen.
Mein Code sieht so aus:
Code:
import numpy as np
from keras.models import Sequential
from keras.layers import Dense
from keras.optimizers import SGD

# Daten erzeugen
training_data = np.array([[0,0],[0,1],[1,0],[1,1]], "float32")
target_data = np.array([[0],[0],[0],[1]], "float32")

# Modell erzeugen
model = Sequential()
model.add(Dense(1, input_dim=2, activation='sigmoid'))

# Modell kompilieren
sgd = SGD(lr=0.1)
model.compile(loss='mean_squared_error', optimizer=sgd)

# Modell trainieren
model.fit(training_data, target_data, epochs=1000)

# Modell testen
print(model.predict(training_data))

Theoretisch funktioniert das auch so. Die Ausgabe am schluss sieht so aus:
[[0.04564238]
[0.2500483 ]
[0.24398649]
[0.69230145]]

Wenn ich jetzt sagen würde, alles was kleiner ist als 0,5 entspricht einem False und alles was größer ist entspricht einem True, dann wäre das richtig. Aber irgendwie hätte ich gedacht, dass ich durch "activation='sigmoid'" erreiche, dass entweder 0 oder 1 ausgegeben wird.
Was mach ich hier falsch?

Und dann hab ich noch versucht einem neuronalen Netz beizubringen, zwei Eingabewerte zu Multiplizieren. Dafür habe ich im vergleich zum obigen Beispiel noch einen Hidden-Layer hinzugefügt (weil das ja ein klein wenig komplexer ist)

Der Code sieht so aus:
Code:
import tensorflow as tf
import numpy as np

# Generate toy data
inputs = np.array([[1, 1], [2, 2], [3, 3], [4, 4], [1, 4], [1, 2], [1, 3], [1, 0], [2, 3], [3, 4], [6, 5], [9, 8], [10, 12], [0, 5], [100, 2], [2, 100], [5, 5], [2, 50], [8, 3], [3, 7], [2, 9], [8, 5], [11, 2], [2, 11], [3, 19], [25, 7], [7, 33], [4999, 5], [48, 5111], [2, 15], [3, 5626], [56, 5], [5, 44], [3, 12], [4, 13], [4, 16], [4, 20], [4, 0], [0, 55555], [1, 55], [2, 555], [2, 5555], [3, 455], [4, 1564], [9, 455], [100, 9], [100, 0], [5, 2], [151, 12], [4544, 2], [1, 4], [4, 2], [55, 2], [6, 7], [7, 8], [25, 5], [66, 666], [712, 2], [4, 7], [8, 9], [7, 9], [6, 7], [6, 5], [5, 9]])
outputs = np.array([[1], [4], [9], [16], [4], [2], [3], [0], [6], [12], [30], [72], [120], [0], [200], [200], [25], [100], [24], [21], [18], [40], [22], [22], [57], [175], [231], [24995], [245328], [30], [16878], [280], [220], [36], [52], [64], [80], [0], [0], [55], [1110], [11110], [1365], [6256], [4095], [900], [0], [10], [1812], [9088], [4], [8], [110], [42], [56], [125], [43956], [1424], [28], [72], [63], [42], [30], [45]])

# Modelldefinition
model = tf.keras.models.Sequential([
  tf.keras.layers.Dense(1, input_shape=(2,), activation="relu"),
  tf.keras.layers.Dense(64,  activation='relu'),
  tf.keras.layers.Dense(1,  activation='relu'),
])

# Kompilierung des Modells
model.compile(optimizer='sgd', loss='mean_squared_error', metrics=['accuracy'])

# Trainieren des Modells
model.fit(inputs, outputs, epochs=500)


# Test model
print(model.predict(np.array([[3, 3]])))

Aber ich habe es absolut nicht geschafft, dass mein LOSS runter geht. Ich habe auch mit verschieden vielen Hidden Layern experimentiert, ich habe verschieden viele Epochen verwendet, ich habe verschiedene Aktivierungsfunktionen verwendet und ich habe es mit dem adam-Optimizer versucht.
Das Ergebnis war immer mehr oder weniger das gleiche: Ein sehr hoher Loss und eine Ausgabe die weit von dem entfernt war, was ich wollte.

Was mach ich falsch?
 
Ich glaube du hast absolut keinen Plan wofür Neuronale Netze gedacht sind ...... du versuchst dem ganzen eine Aufgabe bei zu bringen welche EINFACHSTE Logik sind bzw. etwas das jeder verdammte Taschenrechner macht .... Die netze sind nicht dafür gedacht Fixe aufgaben zu lösen die jeder Affe in einen Taschenrechner eingeben kann ...... Setzen 6 ... Ernst gemeint !
 
Also dass man zum Lernen für sowas ein NN trainiert ist nicht verkehrt. Gibt viele Tutorials, die das vormachen. NNs sind halt auch nicht ganz einfach zu verstehen und irgendwo muss man halt anfangen. Klar, dass das nicht das ist, wozu man sie in der Industrie verwendet...
Zu deiner ersten Frage: Die Sigmoid Funktion gibt Werte zwischen 0 und 1 aus, musst dir nur mal anschauen, wie der Graph ausschaut:
1920px-Logistic-curve.svg.png

Also einfach prüfen, ob kleiner 0,5 dann passt das schon. Eine Funktion, die entweder 0 oder 1 ausgibt, würde als Aktivierungsfunktion für ein NN auch nicht taugen, da man sie nicht ableiten kann.
 
  • Gefällt mir
Reaktionen: madmax2010 und wakko0815
Natürlich ist mir bewusst, dass man für solche simplen Dinge kein neuronales Netz braucht.

Wenn ich aber echte Daten verwende, bei denen es vielleicht sogar ungewiss ist, ob das neuronale Netz was daraus lernen kann oder nicht, dann weiß ich nicht ob ich scheitere, weil meine Daten Müll sind oder ob ich scheitere weil ich in der Architektur des neuronalen Netzes etwas falsch mache. Oder ob ich beim tunen der Hyperparameter was falsch mache.

Deshalb hab ich mir eben erstmal einen ganz einfachen weg gesucht, wie ich mir einfache Daten generieren kann, bei denen ich einfach nachvollziehen kann, was raus kommen müsste.
Und ich wüsste nicht warum das ein neuronales Netz nicht lernen können soll.
 
NatokWa schrieb:
Ich glaube du hast absolut keinen Plan wofür Neuronale Netze gedacht sind ...... du versuchst dem ganzen eine Aufgabe bei zu bringen welche EINFACHSTE Logik sind bzw. etwas das jeder verdammte Taschenrechner macht .... Die netze sind nicht dafür gedacht Fixe aufgaben zu lösen die jeder Affe in einen Taschenrechner eingeben kann ...... Setzen 6 ... Ernst gemeint !
Allerdings hat er es "Anfängerproblem" genannt.
Du hingegen hast eine sichtliche Orthographie-Schwäche, nicht nur hier, über all deine Kommentare im Forum hinweg. Obwohl du also bereits mit den Basics eines Schulkindes überfordert bist, vergibst du Schulnoten ^^ ?
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: madmax2010 und ni-sc
Zurück
Oben