Keras Tutorial/Forum gesucht



  • Kennt ihr ein gutes Forum/Tutorial für den Einstieg in Keras mittels Python?
    Offenbar wird das Thema hier kaum diskutiert.



  • @Erhard-Henkes
    Ich hatte mir mal das Buch Machine Learning mit Python angeschaut.

    Ich find das Buch für den Einstieg recht gut. Vor allen DIngen auch deswegen weil es sich mit der Datenanalyse (z.B. Dimensionsreduktion) beschäftigt.





  • Nehmen wir mal ein konkretes Beispiel:

    from keras import Sequential, layers
    from keras.layers import Dense
    
    model=Sequential() #einfaches lineares Modell
    
    #Input-Layer input muss 1 sein, da es die Dimension unserer Liste ist 
    model.add(layers.Dense(units=2,input_shape=[1]))
    
    #Zwischenlayer
    model.add(layers.Dense(units=2))
    model.add(layers.Dense(units=2))
    model.add(layers.Dense(units=2))
    
    #Outputlayer units muss 1 sein
    model.add(layers.Dense(units=1))
    
    eingang=[ 1, 2, 3,  4,  5,  6,  7,  8,  10,  11,  12,  14,  16,  17,  18,  19,  20]
    ausgang=[ 1, 4, 9, 16, 25, 36, 49, 64, 100, 121, 144, 196, 256, 289, 324, 361, 400] 
    
    model.summary()
    
    #Erstellen des Netzes ("adam"alternativ zu "sgd")
    model.compile(loss='mean_squared_error',optimizer='adam')
    
    #Trainieren des Netzes mit ... Durchläufen
    model.fit(x=eingang,y=ausgang,epochs=4000)
    
    #Vorhersagen der Zahlen
    print(model.predict([9]))
    print(model.predict([13]))
    print(model.predict([15]))
    

    [[115.986626]] <-- 81 erwartet
    [[200.6325]] <-- 169 erwartet
    [[242.95547]] <-- 225 erwartet

    Zumeist wird nur das technische Vorgehen erklärt, aber nicht das wirklich interessante Knowhow. Die Frage ist hier, wie optimiert man geschickt, dass die quadratische Funktion möglichst gut abgebildet wird. Für einen Einsteiger ist das ein schwieriger Schritt.



  • Wie man geschickt optimiert ist eine sehr gute Frage. Ich fürchte, die Antwort ist: Erfahrung und Ausprobieren.

    Bei dem Problem würde ich wahrscheinlich mit nur einem bis zwei Hidden Layern arbeiten, dafür mit mehr Neuronen in den Layern.

    Außerdem kann man die Trainingsdaten vergrößern und gerne die selben Daten häufiger zum Training ins Netzwerk stecken. Bei einem größeren Trainingsdatenset kann man dann auch überlegen, ob es nicht besser ist, Batches ins Netzwerk zu stecken, auf denen dann der Fehler minimiert wird (batch_size ist ein möglicher Parameter von model.fit().

    Da üblicherweise die Gewichte zufallsinitialisiert werden, hilft es auch schonmal das Training mehrfach zu starten und zu gucken, bei welchem Durchlauf man das beste Ergebnis erhält.

    Ich glaube, du suchst vlt eher nach einem Buch über neuronale Netze insgesamt. Da kann ich aber leider auch keins Empfehlen, ich habe mich da nach dem Studium nicht mehr so intensiv mit auseinander gesetzt.



  • Ich möchte einfach wissen, wie man das Thema oben konkret optimiert, oder ist das noch Alchimie? 😁
    batch_size bringt nichts, doppelt so viele units pro Layer auch nicht.
    Daten einfach doppelt anbieten ist ebenfalls sinnlos.
    Nur ein Zwischenlayer führt zur Verschlechterung, endlich ein Effekt. 😎

    Mit linearen Daten ist es übrigens ganz easy und super exakt.



  • Was aufällt ist, dass die Loss Funktion recht schnell nicht weiter konvergiert. Die Doku (https://keras.io/api/layers/core_layers/dense/) sagt, dass standartmäßig keine Aktivierungsfunktion mit gegeben wird. Damit kommt jeweils nur die gewichtete Summe der Eingänge aus dem Neuron. Eigentlich ist die Aktivierungsfunktion ein zentrales Element eines KNN.

    import tensorflow as tf
    from tensorflow import keras
    from tensorflow.keras import layers
    from tensorflow.keras.models import Sequential
    
    model=Sequential() #einfaches lineares Modell
    
    #Input-Layer input muss 1 sein, da es die Dimension unserer Liste ist 
    model.add(layers.Dense(units=2,input_shape=[1]))
    
    #Zwischenlayer
    model.add(layers.Dense(units=10, activation='relu'))
    model.add(layers.Dense(units=10, activation='relu'))
    #model.add(layers.Dense(units=2, activation='relu'))
    
    #Outputlayer units muss 1 sein
    model.add(layers.Dense(units=1))
    
    eingang=[ 1, 2, 3,  4,  5,  6,  7,  8,  10,  11,  12,  14,  16,  17,  18,  19,  20]
    ausgang=[ 1, 4, 9, 16, 25, 36, 49, 64, 100, 121, 144, 196, 256, 289, 324, 361, 400] 
    
    model.summary()
    
    #Erstellen des Netzes ("adam"alternativ zu "sgd")
    model.compile(loss='mean_squared_error',optimizer='adam')
    
    #Trainieren des Netzes mit ... Durchläufen
    model.fit(x=eingang,y=ausgang, batch_size=len(eingang), epochs=6000)
    
    #Vorhersagen der Zahlen
    print(model.predict([9]))
    print(model.predict([13]))
    print(model.predict([15]))
    

    Damit komme ich schon deutlich näher an die erwarteten Werte dran. In der Feinabstimmung kann man noch mehr / andere Trainingsdaten und/oder Trainingsdaten in zufälliger Reihenfolge dem Netz präsentieren (vlt macht das Keras schon automatisch).
    Man könnte auch noch mit dem Initializer rumspielen. Ich glaube, der Default hängt von einem Seed ab, der per default null ist. Damit kann man natürlich auch in einem lokalen Minimum hängen bleiben.



  • @Schlangenmensch sagte in Keras Tutorial/Forum gesucht:

    import tensorflow as tf
    from tensorflow import keras
    from tensorflow.keras import layers
    from tensorflow.keras.models import Sequential

    model=Sequential() #einfaches lineares Modell

    #Input-Layer input muss 1 sein, da es die Dimension unserer Liste ist
    model.add(layers.Dense(units=2,input_shape=[1]))

    #Zwischenlayer
    model.add(layers.Dense(units=10, activation='relu'))
    model.add(layers.Dense(units=10, activation='relu'))
    #model.add(layers.Dense(units=2, activation='relu'))

    #Outputlayer units muss 1 sein
    model.add(layers.Dense(units=1))

    eingang=[ 1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 12, 14, 16, 17, 18, 19, 20]
    ausgang=[ 1, 4, 9, 16, 25, 36, 49, 64, 100, 121, 144, 196, 256, 289, 324, 361, 400]

    model.summary()

    #Erstellen des Netzes ("adam"alternativ zu "sgd")
    model.compile(loss='mean_squared_error',optimizer='adam')

    #Trainieren des Netzes mit ... Durchläufen
    model.fit(x=eingang,y=ausgang, batch_size=len(eingang), epochs=6000)

    #Vorhersagen der Zahlen
    print(model.predict([9]))
    print(model.predict([13]))
    print(model.predict([15]))

    Ja, das ist schon der richtige Weg.
    [[84.53381]]
    [[159.30203]]
    [[224.70946]]



  • Dies hier klappt auch schon recht brauchbar:

    from keras import Sequential, layers
    from keras.layers import Dense
    
    model=Sequential() #einfaches lineares Modell
    
    #Input-Layer input muss 1 sein, da es die Dimension unserer Liste ist
    model.add(layers.Dense(units=32,activation="sigmoid", input_shape=[1]))
    
    #Zwischenlayer
    model.add(layers.Dense(units=16))
    model.add(layers.Dense(units=8))
    model.add(layers.Dense(units=4))
    model.add(layers.Dense(units=2))
    
    #Outputlayer units muss 1 sein
    model.add(layers.Dense(units=1))
    
    eingang=[ 1, 2, 3,  4,  5,  6,  7,  8,  10,  11,  12,  14,  16,  17,  18,  19,  20]
    ausgang=[ 1, 4, 9, 16, 25, 36, 49, 64, 100, 121, 144, 196, 256, 289, 324, 361, 400]
    
    model.summary()
    
    #Erstellen des Netzes
    model.compile(loss='mean_squared_error',optimizer='adam')
    
    #Trainieren des Netzes mit ... Durchläufen
    model.fit(x=eingang,y=ausgang,epochs=4000)
    
    #Vorhersagen der Zahlen
    print(model.predict([9]))
    print(model.predict([13]))
    print(model.predict([15]))
    

    [[79.69823]]
    [[170.17186]]
    [[227.46758]]



  • @Erhard-Henkes sagte in Keras Tutorial/Forum gesucht:

    activation='relu'

    Nun bleibt die Frage: Wo lerne/finde ich hier als Einsteiger die ideale Vorgehensweise? (Buch, Tutorial, ...)



  • Ich habe da leider nichts zu Hand. Insgesamt zum Thema KNN hat David Kriesel ein nettes Skript geschrieben: https://www.dkriesel.com/science/neural_networks Das ist aber von 2007, die "Relu" Funktion z.B. hat er nicht drinnen und im KNN Aufbau hat sich in den letzten 14 Jahren einiges getan (Convolutional Networks z.B. ). Aber als Grundlagenliteratur lohnt sich das bestimmt immer noch.


Anmelden zum Antworten