[Python] Neural Network

  • Hi Zusammen,


    da ich kein richtiges Forum finde und meine ersten Erfahrungen im Programmieren mit AutoIt gemacht habe und auch heute noch sehr viel benutze, entscheide ich mich einfach mal dazu dieses Forum zu nutzen :)


    Vielleicht gibt es ja den ein oder anderen der auch schon mit neuronalen Netzwerken zu tun hatte und kann seine Meinung oder Verbesserungen abgeben.


    Programmiert wird auf der PyCharm Community Edition mit anaconda3 auf Python 3.7 basis.


    Ich habe mich mal dran versucht ein dynamisches Modell zu bauen dass nach bestmöglichen Modellen sucht. Man muss sagen, ich bin noch relativ unerfahren im Aufbau der neuronalen Netzwerken, habe jedoch schon durch mehrere Tutorials ein wenig wissen aufgebaut. Ob meine programmierung jedoch stimmt sei dahingestellt ;) Es läuft, bringt aber nicht die gewünschten Ergebnissen.


    Das neuronale Netz soll anhand von mehreren Inputs einen Output berechnen. Dieser Output ist eine Zahl zwischen 50 und ca. 250 und wird einfach durch 100 geteilt um dem neuronalen Netz es zu vereinfachen über die Neuronen und Bias etc. Somit haben wir als Output eine Zahl zwischen 0.05 und 2.5.


    Der Code ist um gottes Willen nicht perfekt und sehr verbesserungswürdig. Aber genau deswegen bin ich hier.

    Ich möchte gerne ein Konstrukt bauen, dass selbstständig nach dem besten Setup sucht und falls ein Setup "schlecht" ist es verworfen wird und ein neues beginnt. Activation Func in Output? Lieber Linear oder Non-Linear(mit activation)...


    Beschreibung: Destillationsanlage mit Rückführung. Es soll eine bestimmte Menge Destillat(Output) produziert werden. Dabei spielt die Eingangsmenge "Feed", die Temperatur des Verdampfers und das wieder in die Anlage zurückgeführte Destillat "Reflux" eine große Rolle. Die Parameter A bis E geben jeweils die Zusammensetzung des Stoffes an. Parameter A, B und E destillieren z.B. bei einer geringeren Temperatur. C und D haben im Destillat nichts zu suchen. Durch die Rückführung wird z.B. der Anteil an A, B und E erhöht und somit der Ausgangsstoff "verdünnt" wodurch die Parameter C und D extrahiert werden. Destillationsanlage eben ;).


    Verbesserungen und Ideen sind erwünscht! Die Dynamische Erstellung kann natürlich auch auf weitere andere Layer erweitert werden. Das Setup muss natürlich zu der Eingabe passen. Bildbearbeitung hat natürlich einen anderen Ansatz, falls man die Conv. Layer aber auch hier einbinden könnte, her damit. Danke :)


    Beispielcode 5 Zeilen Input:

    tensor([[3.5000000000e+02, 3.1950000000e+02, 2.4680000305e+02, 2.9270000458e+00,

    2.7205999374e+01, 3.4679999352e+00, 2.6322999954e+01, 3.1165000916e+01],

    [3.8000000000e+02, 3.1950000000e+02, 2.4700000000e+02, 2.7620000839e+00,

    2.9021999359e+01, 3.6809999943e+00, 2.6806999207e+01, 2.8224000931e+01],

    [2.2000000000e+02, 3.5300000000e+02, 2.4400000000e+02, 4.9959998131e+00,

    2.8895000458e+01, 9.1900002956e-01, 6.2230000496e+00, 5.2880001068e+01],

    [2.3000000000e+02, 2.6800000000e+02, 2.4750000000e+02, 9.3000002205e-02,

    3.8362998962e+01, 5.2449998856e+00, 3.8039001465e+01, 1.6130000353e+00],

    [3.8000000000e+02, 3.2550000000e+02, 2.4700000000e+02, 2.7620000839e+00,

    2.9021999359e+01, 3.6809999943e+00, 2.6806999207e+01, 2.8224000931e+01]])


    Beispielcode 5 Zeilen passender Output:

    tensor([[1.1399999857],

    [1.1549999714],

    [1.1900000572],

    [0.8399999738],

    [1.1000000238]])


  • Moin,


    leider bin ich wirklich nicht fit in Python, ein MultilayerNN habe ich dort aber (from scratch) schonmal implementiert (war eine Hausaufgabe, da muss man wohl oder übel durch :D). Leider habe ich wie gesagt von Python keinen Dunst und daher meine Inspiration aus youtube gezogen:

    - relativ theoretisch (aber sehr einfach erklärt) wie man ein NN baut: 3B1B

    - Python NN (nur der Anfang, in den Links/Kommentaren ist aber ein fertiges was funktioniert): SL


    Ich bin mir fast sicher, dass du die Videos bereits kennst, aber falls nicht hilft dir das möglicherweise. So wie ich das sehe bist du mit einem simplen NN (und z.B. Sigmoid + ((8), 13, 7, 3, (1)) das du selbst gebastelt hast besser bedient, als wenn du mit Kanonen auf Spatzen schießt (pytorch). Dann verstehst du auch woher jeder Wert kommt, wie alles zustandegebracht wurde etc. Ggf fällt dir dann eine Methode ein wie du dein selbst gebasteltes NN an die Bedingungen die du hast anpassen kannst.


    Ein paar Tips:

    - Skaliere deinen Input/Output immer zwischen 0 und 1 (oder -1 bis 1, je nach Aktivierungsfunktion), da ist die Ableitung der Aktivierungsfunktion am brauchbarsten.

    - Größere Netze brauchen viele Trainingsdaten, wenn man ihnen zu wenige gibt "lernen" sie die Daten und nicht das Prinzip dahinter

    - (vorallem) Kleine Netze fressen sich manchmal auf unbestimmte Zeit fest. Danach verbessern sie sich um einen unvorhersehbaren Betrag. Es ist ziemlich schwierig (bzw. ich wüsste keinen Ansatz dazu) nach einer festgelegten Zeit T herauszufinden welches Modell "gut" ist und welches "schlecht" ist. Man kann sehr grob aussortieren (ggf. die "schlechtesten" 50% ausschließen), das ist aber keine Garantie dafür, dass die "besseren" 50% auf lange Sicht "gut" bleiben.


    Es tut mir leid, dass ich nicht wirklich konkret helfen kann, vielleicht konnte ich aber einen Anstoß bieten, dann hat sich dieser Beitrag bereits gelohnt. Neurale Netze sind nicht unbedingt das am besten abgedeckte Fachgebiet hier im Forum :D


    lg

    M

  • Hi,


    ich habe zwar keine Ahnung, um was es geht, habe aber das Programm mal versucht zu verstehen.

    Dabei hatte ich ein Deja-vu und wurde schlagartig an ein Ereignis in meiner Vergangenheit erinnert....


    Die "Problematik", aus mehreren Inputs EINEN (bestenfalls optimalen) Output zu generieren, ist ziemlich trivial. Wer jetzt dumm guckt uns glaubt, das "Problem" sei nur mit KI und Massen an generierten Traininggsdaten zu lösen, der irrt, und zwar gewaltig!

    Vor ca. 35 Jahren war ich in der damals "hippen" und boomenden (Löt-)Robotertechnik zu Gange.

    Jedenfalls war ich in Barcelona in einem Werk zur Herstellung von (natürlich Röhren-) Fernsehern mit der Montage einer dieser Lötroboterzellen beschäftigt.

    Die Halle war ca. so groß wie ein Fußballfeld, vorne kamen alle Einzelteile des Fernsehers rein, hinten am Fließband fuhr der verpackte Fernseher im 10-Sekunden-Takt auf Paletten und direkt in die LKW.


    Dabei konnte ich mir diverse Produktionsschritte anschauen. Am wirklich beeindruckensten war der Arbeitsplatz eines Mitarbeiters, der für die "Einstellung" der ca. 20 Trimpotentiometer zur Bilddarstellung verantwortlich war.

    Der Fernseher ohne Gehäuse kam übers Fließband gefahren, hielt vor ihm an, von hinten an die Platine fuhr ein "Kontaktboard", welches die Spannungsversorgung herstellte, und über den Antenneneingang ein Testbild auf den Schirm brachte.

    Da die Trimpotis auf der Fernseherplatine "so wie gefertigt" auf die Platine gelötet wurden, kann man sich vorstellen, wie das Testbild am Anfang der Messung aussah: reinstes Schneegestöber!


    Jeden dieser Potis von Hand einstellen zu wollen ist der reinste Wahnsinn. Einige befinden sich in Regelungskreisen und sind voneinander abhängig. Für einen geübten Fernsehtechniker, der das Bild "von Hand" aus ZUFÄLLIGER Stellung der Potis einstellen wollte, ein Sache von ca. 20min bis 1/2 Stunde.

    Der Mitarbeiter in der Fabrik am Fließband hatte für die Einstellung aber nur maximal 10 Sekunden, die Taktzeit!

    Für eine mathematische "Berechnung" (ja, ich war damals ziemlich fit in Regelungstechnik, eigentlich sollte das Regelungsmathematik heißen :o) ) stand mir ein 8088-Computer mit einem 4,77Mhz ( ja, Megaherz) - Prozessor zur Verfügung.

    Dieses Problem "mathematisch" zu lösen, war also eine unlösbare Aufgabe. Wie haben die Techniker es geschafft, trotzdem ca. 8600 Fernseher pro Tag zu produzieren, die ALLE ein Bild anzeigten?!


    Auf dem Kontaktboard, welches von hinten und oben auf die Platine fuhr, waren an der Position der Trimpotis motorisch angetriebene "Schraubendreher" befestigt, welche die Potis gedreht hatten.

    Dabei drehte jeder dieser Schraubendreher unabhängig voneinander in zufälliger Geschwindigkeit seinen Poti von Anschlag zu Anschlag. Einfach endlos immer hin und her. Es wurden also alle der ca. 20 Parameter gleichzeitig in unterschiedlicher Geschwindigkeit verändert!

    "Irgendwann" nach einigen Sekunden zeigte sich auf dem Bildschirm ein mehr oder weniger gutes Testbild!

    Der zuständige Mitarbeiter hatte nun "nur noch" die Aufgabe, visuell zu beurteilen, wie "gut" das Bild dargestellt wurde. Er betätigte einen Handschalter, wenn er das Bild als "gut" befand!

    Die Reaktionszeit dieses Menschen war absolut atemberaubend.

    Der Fernseher fuhr weiter auf dem Band, bekam sein Gehäuse und ging in die Verpackung.

    Derjenige Fernseher, bei dem der Mitarbeiter innerhalb der Taktzeit KEIN gutes Bild ermitteln konnte, wurde ausgeschleust und vor der Begutachtungsstation wieder eingeschleust.

    Das war Taktneutral, denn manchmal dauerte der Kalibrierungsprozess auch nur 3 Sekunden.....


    Was hat das jetzt alles mit dem "Problem" des TE zu tun?!

    Zuerst stellt sich die Frage nach dem XY-Problem....:/

    Ist der Ansatz überhaupt geeignet, um ein solches Problem mittels einer KI zu lösen? Gibt es Vergleichsprojekte?

    Aus der Beschreibung geht es wohl um eine technische Optimierung der beeinflussbaren Parameter einer Destillationsanlage. Ziel ist entweder die energetische Optimierung der Anlagen und/oder die Gewährleistung einer hohen bzw. höheren Reinheit der Destillate. Jedenfalls geht es um Verbesserungen im unteren Prozentbereich.

    Ich will ja niemandem die Illusion rauben, aber eine Destillationsanlage ist ein hochkomplexes Verfahren mit zahlreichen vor- und nachgeschalteten Prozessschritten.

    Eine KI ist per se strunzdumm. Hört sich heutzutage bissl komisch an, ist aber so!

    Selbst "schlaue" KI´s sind nur deshalb so gut, weil ganze Horden von Entwicklern und Spezialisten die KI oder das neuronale Netz auf GENAU DIESES Problem getrimmt und optimiert haben. Wobei die Frage noch geklärt werden muß, was ist denn "gut"? Reichen da 80% "Erfolgsquote" oder reichen 97% oder darf die Fehlerquote "nur" bei 0,32 Promille liegen?


    Vielleicht ist die Zeit zum Training einer (für das aktuelle Problem nicht qualifizierten) KI (mit dem Risiko des Mißerfolgs) besser in einem Gespräch mit einem Spezialisten für Destillationsanlagenoptimierung angelegt....


    Aktuell befinde ich mich selbst in einem Erneuerungsprozess für eine komplette Fertigungsanlage für hochkomplexe Elemente. Die Vorgaben sind klar: stelle mir eine Anlage hin, die mit der gleichen Anzahl Mitarbeiter mehr und individuellere Produkte herstellt, bei höherer Qualität und niedrigeren Kosten.

    Und ja, auch dort kommt in kleineren Teilbereichen KI zum Einsatz, vorwiegend im Bereich Bilderkennung. Aber diese Komponenten sind ein "Zukaufteil" mit vorher genau spezifizierten Eigenschaften und Leistungen.

    Für die 99,8% "Restmaschinen" verlasse ich mich lieber auf qualifizierte Techniker und Ingenieure und meine eigenen Erfahrungen in der Prozessoptimierung.

  • Hi Mars, Andy,


    Mars: Danke für dein Feedback, ich schätze auch den Output zwischen 0 und 1 zu skalieren ist wohl am besten. Hab die Output Daten jetzt mal über die Standardisierungsformel y = (x - min) / (max - min) eingespielt. Somit kann man sie auch später gut zurückrechnen. Finde ich besser als den min/max Wert vom aktuellen Trainingsset da es unmöglich wird wenn höhere oder tiefere Werte reinkommen. So habe ich definitiv einen Minimal- und Maximalwert den ich selbst bestimmen und sagen kann: Das sind die Grenzen.


    Andy: Du täuschst dich :). Ein Neuronales Netz ist genau dafür bekannt aus mehreren Inputs einen Output zu generieren. Diese künstlichen Netze sind aufgebaut wie unser Gehirn. Vergleichen wir einen Apfel und eine Birne. Ich möchte nun wissen welche Frucht am "zärtesten" ist. Bekommt das Netz einen Apfel als Bildinput, generiert es einen ganz anderen Output als bei einem Apfel. Dabei spielen die Form, die Größe, die Farbe etc. alles eine Rolle. Jedes Neuron hat unterschiedliche Gewichte, sieht es an der Form dass es rund ist (Apfel) werden andere Zweige genommen was ein anderes resultat ergibt als wenn die Form nicht rund wäre. Schwer zu erklären wenn du dich damit nicht auskennst :)



    Aber es geht mir in diesem Sinne auch nicht nur um die Destillationsanlage sondern eher um ein Konstrukt zu bauen dass auf vielen Anwendungsbeispielen genutzt werden kann. (Ein Neuronales Netz dass eigenständig nach dem bestmöglichen Setup sucht, egal ob es jetzt eine Destillationsanlage oder eine XOR-Funktion ist, die "gelernt" werden soll. Die Input-Daten müssen natürlich vorher richtig ausgewählt werden. Würde man bei einer Destillationsanlage die Temperatur des Verdampfers nicht im Input haben, dann würde es nie eine Lösung finden um Vorhersagen treffen zu können. Natürlich wird es lange dauern bis man für sein Projekt dann ein passendes Setup gefunden hat, aber nehmen wir einfach mal an wir hätten einen Supercomputer und es wäre in 1 Minute berechnet :). Darauf soll dieses Projekt hinauslaufen. Es geht mir nicht darum ob es Zeit in Anspruch nimmt sondern dass das Ergebnis dem entspricht was man erwartet. Inputs => Outputs.


    Was ich noch gerne implementieren würde wäre eine Funktion die beschreibt ob das Setup "gut" ist. Wo könnte man da ansetzen? Erstmal verschiedene Loss-Funktionen einbauen (Beispiel siehe Aktivierungsfunktionen)

    Den aktuell berechneten Loss pro Epoch in einer List speichern und dann per Median im abstand von 20-30 Epochen schauen ob es "besser" wird? Aber was tun wenn sich das neuronale Netz umentscheidet und der Loss einen Sprung nach oben macht aber danach wieder kontinuierlich sinkt? Wie könnte man am besten solche Ausreißer als "unkritisch" ansehen. Vlt. wenn die Loss-Funktion auf X-Epochen gesehen nach diesem Sprung besser wird einfach den abort_counter wieder auf 0 setzen?


    Ergibt es Sinn die Funktion Layernorm auf die Hidden Layer anzuwenden? Habe die Chance derzeit mal auf 0 gestellt und die Dropout-Layer chance auf eine Chance zwischen 0 und 100 mit zufälligem Dropout Parameter 0.1 bis 0.5 gesetzt.


    Fragen über Fragen :) Es kann jeder seine Ideen mit einbringen ;)