| Beide Seiten der vorigen RevisionVorhergehende Überarbeitung | |
| p:ki:fische_nachlese [2025/08/27 11:34] – [2. Verfahren konstruieren] Tscherter Vincent | p:ki:fische_nachlese [2026/03/29 11:33] (aktuell) – Ralf Kretzschmar |
|---|
| Bevor das neuronale Netz gebraucht werden kann, muss dieses mit einem Trainingset trainiert werden. Das Trainingset besteht aus mehreren vermessenen Fischen, von welchen wir wissen, zu welcher Fischart sie gehören. Für jede Lodde soll eine 1 vom neuronalen Netz ausgegeben werden, für jeden Hering 0, diese beiden Zahlen werden als "Desired Output" bezeichnet. Aus der Differenz neuronaler Netz Output und Desired Output wird ein Fehlerwert berechnet. Im Training werden die Gewichte zuerst zufällig gewürfelt. Danach werden sie in mehreren Schritten mithilfe des Trainingssets so eingestellt, dass der Fehlerwert immer kleiner wird. Ein Durchgang des gesamten Trainingsets wird als Epoche bezeichnet. In der Regel umfasst ein Training viele Epochen. | Bevor das neuronale Netz gebraucht werden kann, muss dieses mit einem Trainingset trainiert werden. Das Trainingset besteht aus mehreren vermessenen Fischen, von welchen wir wissen, zu welcher Fischart sie gehören. Für jede Lodde soll eine 1 vom neuronalen Netz ausgegeben werden, für jeden Hering 0, diese beiden Zahlen werden als "Desired Output" bezeichnet. Aus der Differenz neuronaler Netz Output und Desired Output wird ein Fehlerwert berechnet. Im Training werden die Gewichte zuerst zufällig gewürfelt. Danach werden sie in mehreren Schritten mithilfe des Trainingssets so eingestellt, dass der Fehlerwert immer kleiner wird. Ein Durchgang des gesamten Trainingsets wird als Epoche bezeichnet. In der Regel umfasst ein Training viele Epochen. |
| |
| Ist das neuronale Netz trainiert, bleiben die Gewichte fix und das neuronale Netz kann verwendet werden, um unbekannte Fische zu "klassifizieren". Wir legen dabei fest, dass Output < 0.5 als Hering erkannt wird und ein Output ≥ 0.5 als Lodde. Der Wert 0.5 wird als Threshold (Grenzwert) bezeichnet. Um herauszufinden, wie gut die Klassifikation ist, wird ein zweites Set verwendet, das "Validationset". | Ist das neuronale Netz trainiert, bleiben die Gewichte fix und das neuronale Netz kann verwendet werden, um unbekannte Fische zu "klassifizieren". Wir legen dabei fest, dass Output < 0.5 als Hering erkannt wird und ein Output ≥ 0.5 als Lodde. Der Wert 0.5 wird als Grenzwert bezeichnet. Um herauszufinden, wie gut die Klassifikation ist, wird ein zweites Set verwendet, das "Validationset". |
| |
| In den vier Abbildungen rechts sind alle Eingangsgrössenpaare, welche den Output 0.5 produzieren, als rote Punkte eingezeichnet. Sie bilden eine Kurve, die sogenannte "Decision Boundary". Alles oben links davon wird als Lodde, alles unten rechts davon als Hering erkannt. Für die Training- und Validationsets sind jeweils die Anzahl falsch klassifizierter Fische angegeben. In den beiden unteren Abbildungen wird die Decision Boundary von einzelnen Fischen beeinflusst. Sie ist stark gekrümmt und der Fehler für das Validationset ist viel grösser als für das Trainingsset. Dies wird als "Overfitting" (Auswendiglernen) bezeichnet. In den beiden oberen Abbildungen erfasst die Decision Boundary den groben Unterschied der beiden Fischarten relativ gut, die Fehler für Training- und Validationset sind ähnlich gross, das neuronale Netz "generalisiert" wie gewünscht. | In den vier Abbildungen rechts sind alle Eingangsgrössenpaare, welche den Output 0.5 produzieren, als rote Punkte eingezeichnet. Sie bilden eine Kurve, die sogenannte "Decision Boundary". Alles oben links davon wird als Lodde, alles unten rechts davon als Hering erkannt. Für die Training- und Validationsets sind jeweils die Anzahl falsch klassifizierter Fische angegeben. In den beiden unteren Abbildungen wird die Decision Boundary von einzelnen Fischen beeinflusst. Sie ist stark gekrümmt und der Fehler für das Validationset ist viel grösser als für das Trainingsset. Dies wird als "Overfitting" (Auswendiglernen) bezeichnet. In den beiden oberen Abbildungen erfasst die Decision Boundary den groben Unterschied der beiden Fischarten relativ gut, die Fehler für Training- und Validationset sind ähnlich gross, das neuronale Netz "generalisiert" wie gewünscht. |
| == ✍ Auftrag == | == ✍ Auftrag == |
| - Just for fun, klicke auf den Button ''▶Run''. Der grüne Bereich wird als Lodde erkannt, der blaue als Hering, der weisse Bereich ist der "Keine Ahnung"-Bereich. Das Ziel besteht darin, ausserhalb des "Keine Ahnung"-Bereichs 100% ✔️ Klassifikationsrate zu erreichen und den "Keine Ahnung"-Anteil (die Prozentzahl nach dem 🗑️-Symbol) so klein als möglich zu halten. | - Just for fun, klicke auf den Button ''▶Run''. Der grüne Bereich wird als Lodde erkannt, der blaue als Hering, der weisse Bereich ist der "Keine Ahnung"-Bereich. Das Ziel besteht darin, ausserhalb des "Keine Ahnung"-Bereichs 100% ✔️ Klassifikationsrate zu erreichen und den "Keine Ahnung"-Anteil (die Prozentzahl nach dem 🗑️-Symbol) so klein als möglich zu halten. |
| {{exorciser/jspg?javascript=%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%0A%2F%2F%20Diese%20Trainings-%20und%20Updateparameter%20d%C3%BCrfen%20ge%C3%A4ndert%20werden.%0Aconst%20LERNRATE%20%3D%201%3B%20%2F%2F%20Dezimalzahl%20%3E%200%0Aconst%20ANZAHL_HIDDEN_NEURONS%20%3D%203%3B%20%2F%2F%20ganzzahliger%20Wert%20%3E%200%0Aconst%20ANZAHL_EPOCHEN%20%3D%202000%3B%20%2F%2F%20ganzzahliger%20Wert%20%3E%200%0Aconst%20EPOCHEN_FUER_GRAFIK_UPDATE%20%3D%20100%3B%20%2F%2F%20ganzzahlig%20Wert%20%3E%200%0Aconst%20THRESHOLD%20%3D%200.3%3B%20%2F%2F%20Dezimalzahl%20%3E%200%0A%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%0A%0A%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%2F%2F%20CONSTANTS%20AND%20GLOBAL%20VARIABLES%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%0A%0A%2F%2F%20constants%0Aconst%20DATA_RANGE%20%3D%2010%3B%0Aconst%20DATA_WINDOW_SIZE%20%3D%20200%3B%0Aconst%20DATA_SCALE%20%3D%20Math.round%28DATA_WINDOW_SIZE%20%2F%20DATA_RANGE%29%3B%0Aconst%20NUM_DATA_PIXEL%20%3D%2050%3B%0Aconst%20PIXEL_SIZE%20%3D%20Math.round%28DATA_WINDOW_SIZE%20%2F%20NUM_DATA_PIXEL%29%3B%0A%0A%2F%2F%20training%20data%0Aconst%20trainInputArray%20%3D%20%5B%0A%09%5B2.5%2C%206.0%5D%2C%0A%09%5B3.5%2C%201.5%5D%2C%0A%09%5B3.5%2C%204.0%5D%2C%0A%09%5B4.0%2C%206.0%5D%2C%0A%09%5B4.0%2C%207.0%5D%2C%0A%09%5B4.5%2C%203.0%5D%2C%0A%09%5B5.0%2C%205.0%5D%2C%0A%09%5B5.5%2C%206.0%5D%2C%0A%09%5B6.5%2C%203.0%5D%2C%0A%09%5B7.0%2C%205.5%5D%2C%0A%09%5B7.5%2C%204.0%5D%2C%0A%09%5B8.5%2C%205.5%5D%2C%0A%09%5B1.5%2C%203.0%5D%2C%0A%09%5B1.5%2C%204.5%5D%2C%0A%09%5B1.5%2C%207.0%5D%2C%0A%09%5B2.0%2C%201.5%5D%2C%0A%09%5B3.0%2C%203.0%5D%2C%0A%09%5B3.0%2C%205.5%5D%2C%0A%09%5B3.0%2C%206.5%5D%2C%0A%09%5B4.0%2C%208.5%5D%2C%0A%09%5B4.5%2C%206.5%5D%2C%0A%09%5B6.5%2C%207.5%5D%2C%0A%09%5B8.0%2C%206.5%5D%2C%0A%09%5B8.0%2C%208.5%5D%0A%5D%3B%0Aconst%20trainOutputArray%20%3D%20%5B0%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%5D%3B%0Aconst%20trainInputMax%20%3D%20%5B9.0%2C%208.5%5D%3B%0Aconst%20trainInputMin%20%3D%20%5B1.5%2C%201.5%5D%3B%0A%0A%2F%2F%20validation%20data%0Aconst%20validInputArray%20%3D%20%5B%0A%09%5B2.5%2C%207.0%5D%2C%0A%09%5B3.5%2C%201.0%5D%2C%0A%09%5B3.5%2C%207.0%5D%2C%0A%09%5B4.0%2C%203.5%5D%2C%0A%09%5B4.5%2C%206.5%5D%2C%0A%09%5B4.5%2C%202.5%5D%2C%0A%09%5B4.5%2C%205.0%5D%2C%0A%09%5B6.0%2C%202.5%5D%2C%0A%09%5B6.0%2C%204.5%5D%2C%0A%09%5B6.5%2C%205.5%5D%2C%0A%09%5B7.5%2C%204.5%5D%2C%0A%09%5B8.5%2C%205.0%5D%2C%0A%09%5B1.5%2C%205.0%5D%2C%0A%09%5B1.5%2C%206.5%5D%2C%0A%09%5B2.0%2C%201.5%5D%2C%0A%09%5B2.5%2C%203.5%5D%2C%0A%09%5B2.5%2C%206.0%5D%2C%0A%09%5B3.5%2C%206.0%5D%2C%0A%09%5B4.0%2C%208.0%5D%2C%0A%09%5B4.0%2C%207.0%5D%2C%0A%09%5B5.5%2C%208.5%5D%2C%0A%09%5B6.5%2C%207.0%5D%2C%0A%09%5B7.5%2C%208.5%5D%2C%0A%09%5B8.5%2C%207.0%5D%0A%5D%3B%0Aconst%20validOutputArray%20%3D%20%5B0%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%5D%3B%0A%0A%2F%2F%20global%20variables%0Alet%20model%2C%20trainInput%2C%20trainOutput%2C%20validInput%2C%20validOutput%2C%20testInput%2C%20actualEpoch%2C%20actualLogs%2C%20trainBuffer%2C%20validBuffer%2C%20decisionBuffer%3B%0A%0A%0A%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%2F%2F%20NEURAL%20NETWORK%20FUNCTIONS%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%0A%0A%2F%2F%0A%2F%2F%20generate%20data%20tensors%0A%2F%2F%0Afunction%20generateTensors%28%29%20%7B%0A%09let%20normalizedTrainInputArray%20%3D%20%5B%5D%3B%0A%09let%20normalizedValidInputArray%20%3D%20%5B%5D%3B%0A%09let%20normalizedTestInputArray%20%3D%20%5B%5D%3B%0A%0A%09%2F%2F%20normalize%20training%20and%20validation%20inputs%0A%09for%20%28i%20%3D%200%3B%20i%20%3C%20trainInputArray.length%3B%20i%2B%2B%29%20%7B%0A%09%09normalizedTrainInputArray.push%28%5B%28trainInputArray%5Bi%5D%5B0%5D%20-%20trainInputMin%5B0%5D%29%20%2F%20%28trainInputMax%5B0%5D%20-%20trainInputMin%5B0%5D%29%2C%20%28trainInputArray%5Bi%5D%5B1%5D%20-%20trainInputMin%5B1%5D%29%20%2F%20%28trainInputMax%5B1%5D%20-%20trainInputMin%5B1%5D%29%5D%29%3B%0A%09%09normalizedValidInputArray.push%28%5B%28validInputArray%5Bi%5D%5B0%5D%20-%20trainInputMin%5B0%5D%29%20%2F%20%28trainInputMax%5B0%5D%20-%20trainInputMin%5B0%5D%29%2C%20%28validInputArray%5Bi%5D%5B1%5D%20-%20trainInputMin%5B1%5D%29%20%2F%20%28trainInputMax%5B1%5D%20-%20trainInputMin%5B1%5D%29%5D%29%3B%0A%09%7D%0A%0A%09%2F%2F%20generate%20training%20input%20and%20output%20tensors%0A%09trainInput%20%3D%20tf.tensor2d%28normalizedTrainInputArray%2C%20%5BnormalizedTrainInputArray.length%2C%202%5D%29%3B%0A%09trainOutput%20%3D%20tf.tensor2d%28trainOutputArray%2C%20%5BtrainOutputArray.length%2C%201%5D%29%3B%0A%09%2F%2F%20let%20trainOutput%20%3D%20tf.oneHot%28tf.tensor1d%28trainOutputArray%29.toInt%28%29%2C%202%29%3B%0A%09%2F%2F%20trainInput.print%28%29%3B%20%2F%2F%20Print%20Tensor%0A%0A%09%2F%2F%20generate%20validation%20input%20and%20output%20tensors%0A%09validInput%20%3D%20tf.tensor2d%28normalizedValidInputArray%2C%20%5BnormalizedValidInputArray.length%2C%202%5D%29%3B%0A%09validOutput%20%3D%20tf.tensor2d%28validOutputArray%2C%20%5BvalidOutputArray.length%2C%201%5D%29%3B%0A%09%2F%2F%20let%20validOutput%20%3D%20tf.oneHot%28tf.tensor1d%28validOutputArray%29.toInt%28%29%2C%202%29%3B%0A%0A%09%2F%2F%20calculate%20normalized%20testing%20inputs%20for%20visualisation%0A%09for%20%28i%20%3D%200%3B%20i%20%3C%20NUM_DATA_PIXEL%20%2B%201%3B%20i%20%3D%20i%20%2B%201%29%20%7B%0A%09%09for%20%28j%20%3D%200%3B%20j%20%3C%20NUM_DATA_PIXEL%20%2B%201%3B%20j%20%3D%20j%20%2B%201%29%20%7B%0A%09%09%09normalizedTestInputArray.push%28%5B%28i%20%2F%20NUM_DATA_PIXEL%20%2a%20DATA_RANGE%20-%20trainInputMin%5B0%5D%29%20%2F%20%28trainInputMax%5B0%5D%20-%20trainInputMin%5B0%5D%29%2C%20%28j%20%2F%20NUM_DATA_PIXEL%20%2a%20DATA_RANGE%20-%20trainInputMin%5B1%5D%29%20%2F%20%28trainInputMax%5B1%5D%20-%20trainInputMin%5B1%5D%29%5D%29%3B%0A%09%09%7D%0A%09%7D%0A%0A%09%2F%2F%20generate%20testing%20input%20tensor%20for%20visualisation%0A%09testInput%20%3D%20tf.tensor2d%28normalizedTestInputArray%2C%20%5BnormalizedTestInputArray.length%2C%202%5D%29%3B%0A%09%2F%2F%09testInput.print%28%29%3B%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20build%20neural%20network%20model%20and%20define%20training%0A%2F%2F%0Afunction%20compileModel%28%29%20%7B%0A%09%2F%2F%20neural%20network%20structure%0A%09model%20%3D%20tf.sequential%28%7B%0A%09%09layers%3A%20%5B%0A%09%09%09tf.layers.dense%28%7B%0A%09%09%09%09name%3A%20%27HiddenLayer1%27%2C%0A%09%09%09%09inputShape%3A%20%5B2%5D%2C%0A%09%09%09%09units%3A%20ANZAHL_HIDDEN_NEURONS%2C%0A%09%09%09%09activation%3A%20%27tanh%27%0A%09%09%09%7D%29%2C%0A%09%09%09tf.layers.dense%28%7B%0A%09%09%09%09name%3A%20%27OutputLayer%27%2C%0A%09%09%09%09units%3A%201%2C%0A%09%09%09%09activation%3A%20%27sigmoid%27%0A%09%09%09%7D%29%0A%09%09%5D%0A%09%7D%29%3B%0A%0A%09%2F%2F%20neural%20network%20training%0A%09model.compile%28%7B%0A%09%09optimizer%3A%20tf.train.sgd%28LERNRATE%29%2C%0A%09%09loss%3A%20tf.losses.meanSquaredError%2C%0A%09%09metrics%3A%20%5B%27mse%27%5D%2C%0A%09%7D%29%3B%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20train%20neural%20network%0A%2F%2F%0Aasync%20function%20trainModel%28%29%20%7B%0A%09await%20model.fit%28%0A%09%09trainInput%2C%20trainOutput%2C%20%7B%0A%09%09%09epochs%3A%20ANZAHL_EPOCHEN%2C%0A%09%09%09shuffle%3A%20true%2C%0A%09%09%09callbacks%3A%20%5B%7B%0A%09%09%09%09onEpochEnd%3A%20async%28epoch%2C%20logs%29%20%3D%3E%20%7B%0A%09%09%09%09%09%2F%2F%20remember%20epoch%20number%20if%20interrupted%0A%09%09%09%09%09actualEpoch%20%3D%20epoch%20%2B%201%3B%0A%09%09%09%09%09actualLogs%20%3D%20logs%3B%0A%09%09%09%09%09%2F%2F%20initiate%20graphic%20update%0A%09%09%09%09%09if%20%28%28%28actualEpoch%29%20%25%20EPOCHEN_FUER_GRAFIK_UPDATE%20%3D%3D%3D%200%29%20%7C%7C%20%28epoch%20%3D%3D%3D%200%29%29%20%7B%0A%09%09%09%09%09%09drawPrediction%28actualEpoch%2C%20logs.loss%29%3B%0A%09%09%09%09%09%7D%0A%09%09%09%09%7D%0A%09%09%09%7D%2C%20%5D%0A%09%09%7D%0A%09%29%3B%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20calculate%20percentage%20of%20correct%20classifications%0A%2F%2F%0Afunction%20calculatePercentageCorrect%28predictedOutput%2C%20trueOutput%29%20%7B%0A%09let%20correct%20%3D%200%3B%0A%09let%20rejected%20%3D%200%3B%0A%09for%20%28i%20%3D%200%3B%20i%20%3C%20predictedOutput.length%3B%20i%2B%2B%29%20%7B%0A%09%09if%20%28predictedOutput%5Bi%5D%20%3C%20%281%20-%20THRESHOLD%29%20%26%26%20predictedOutput%5Bi%5D%20%3E%20THRESHOLD%29%20%7B%0A%09%09%09rejected%20%3D%20rejected%20%2B%201%3B%0A%09%09%7D%20else%20%7B%0A%09%09%09if%20%28%28trueOutput%5Bi%5D%20%3D%3D%3D%201%20%26%26%20predictedOutput%5Bi%5D%20%3E%3D%200.5%29%20%7C%7C%20%28trueOutput%5Bi%5D%20%3D%3D%3D%200%20%26%26%20predictedOutput%5Bi%5D%20%3C%200.5%29%29%20%7B%0A%09%09%09%09correct%20%3D%20correct%20%2B%201%3B%0A%09%09%09%7D%0A%09%09%7D%0A%09%7D%0A%09return%20%7B%0A%09%09correct%3A%20Math.round%28correct%20%2F%20%28predictedOutput.length%20-%20rejected%29%20%2a%20100%29%2C%0A%09%09rejected%3A%20Math.round%28rejected%20%2F%20predictedOutput.length%20%2a%20100%29%0A%09%7D%3B%0A%7D%0A%0A%0A%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%2F%2F%20FUNCTIONS%20FOR%20VISUALISATION%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%0A%0A%2F%2F%0A%2F%2F%20decision%20boundary%20and%20network%20output%0A%2F%2F%0Afunction%20drawPrediction%28epoch%2C%20mseTrain%29%20%7B%0A%09%2F%2F%20make%20predictions%20with%20neural%20network%0A%09let%20training%20%3D%20model.predict%28trainInput%29.arraySync%28%29%3B%0A%09let%20validation%20%3D%20model.predict%28validInput%29.arraySync%28%29%3B%0A%09let%20prediction%20%3D%20model.predict%28testInput%29.arraySync%28%29%3B%0A%0A%09%2F%2F%20calculate%20mse%20and%20percentages%20of%20correct%20classifications%0A%09let%20trainCorrect%20%3D%20calculatePercentageCorrect%28training%2C%20trainOutputArray%29%3B%0A%09let%20validCorrect%20%3D%20calculatePercentageCorrect%28validation%2C%20validOutputArray%29%3B%0A%0A%09%2F%2F%20decision%20boundary%20and%20input%20feature%20space%0A%09decisionBuffer.noStroke%28%29%3B%0A%09let%20element%20%3D%200%3B%0A%09for%20%28i%20%3D%200%3B%20i%20%3C%20NUM_DATA_PIXEL%20%2B%201%3B%20i%20%3D%20i%20%2B%201%29%20%7B%0A%09%09for%20%28j%20%3D%200%3B%20j%20%3C%20NUM_DATA_PIXEL%20%2B%201%3B%20j%20%3D%20j%20%2B%201%29%20%7B%0A%09%09%09%2F%2F%20transform%20neural%20network%20output%20into%20a%20color%0A%09%09%09if%20%28prediction%5Belement%5D%5B0%5D%20%3C%20%281%20-%20THRESHOLD%29%20%26%26%20prediction%5Belement%5D%5B0%5D%20%3E%20THRESHOLD%29%20%7B%0A%09%09%09%09decisionBuffer.fill%28%22white%22%29%3B%0A%09%09%09%7D%20else%20%7B%0A%09%09%09%09if%20%28prediction%5Belement%5D%5B0%5D%20%3E%200.5%29%20%7B%0A%09%09%09%09%09decisionBuffer.fill%28%22lightgreen%22%29%3B%0A%09%09%09%09%7D%20else%20%7B%0A%09%09%09%09%09decisionBuffer.fill%28%22lightblue%22%29%3B%0A%09%09%09%09%7D%0A%09%09%09%7D%0A%09%09%09%2F%2F%20check%20for%20decision%20boundary%20and%20alter%20color%0A%09%09%09if%20%28%28element%20%25%20%28NUM_DATA_PIXEL%20%2B%201%29%29%20%21%3D%3D%200%20%26%26%20%28%28prediction%5Belement%5D%5B0%5D%20%3E%200.5%20%26%26%20prediction%5Belement%20-%201%5D%5B0%5D%20%3C%3D%200.5%29%20%7C%7C%20%28prediction%5Belement%5D%5B0%5D%20%3C%3D%200.5%20%26%26%20prediction%5Belement%20-%201%5D%5B0%5D%20%3E%200.5%29%29%29%20%7B%0A%09%09%09%09decisionBuffer.fill%28%27red%27%29%3B%0A%09%09%09%7D%0A%09%09%09if%20%28element%20%3E%3D%20NUM_DATA_PIXEL%20%2B%201%20%26%26%20%28%28prediction%5Belement%5D%5B0%5D%20%3E%200.5%20%26%26%20prediction%5Belement%20-%20%28NUM_DATA_PIXEL%20%2B%201%29%5D%5B0%5D%20%3C%3D%200.5%29%20%7C%7C%20%28prediction%5Belement%5D%5B0%5D%20%3C%3D%200.5%20%26%26%20prediction%5Belement%20-%20%28NUM_DATA_PIXEL%20%2B%201%29%5D%5B0%5D%20%3E%200.5%29%29%29%20%7B%0A%09%09%09%09decisionBuffer.fill%28%27red%27%29%3B%0A%09%09%09%7D%0A%09%09%09decisionBuffer.rect%28DATA_SCALE%20%2a%20i%20%2F%20NUM_DATA_PIXEL%20%2a%20DATA_RANGE%20-%20PIXEL_SIZE%20%2F%202%2C%20DATA_SCALE%20%2a%20%2810%20-%20j%20%2F%20NUM_DATA_PIXEL%20%2a%20DATA_RANGE%29%20-%20PIXEL_SIZE%20%2F%202%2C%20PIXEL_SIZE%2C%20PIXEL_SIZE%29%3B%0A%09%09%09element%20%3D%20element%20%2B%201%3B%0A%09%09%7D%0A%09%7D%0A%09image%28decisionBuffer%2C%200%2C%200%29%3B%0A%09image%28decisionBuffer%2C%20DATA_WINDOW_SIZE%2C%200%29%3B%0A%0A%09%2F%2F%20draw%20training%20and%20validation%20samples%0A%09image%28trainBuffer%2C%200%2C%200%29%3B%0A%09image%28validBuffer%2C%20DATA_WINDOW_SIZE%2C%200%29%3B%0A%0A%09%2F%2F%20add%20lables%20to%20training%20and%20validation%20feature%20space%0A%09noStroke%28%29%3B%0A%09text%28%22Training%3A%20%22%20%2B%20trainCorrect.correct%20%2B%20%22%25%20%E2%9C%94%EF%B8%8F%EF%B8%8F%2C%20%22%20%2B%20trainCorrect.rejected%20%2B%20%22%25%20%F0%9F%97%91%22%2C%202%20%2a%20PIXEL_SIZE%2C%204%20%2a%20PIXEL_SIZE%29%3B%0A%09text%28%22Validation%3A%20%22%20%2B%20validCorrect.correct%20%2B%20%22%25%20%E2%9C%94%EF%B8%8F%2C%20%22%20%2B%20validCorrect.rejected%20%2B%20%22%25%20%F0%9F%97%91%22%2C%20DATA_WINDOW_SIZE%20%2B%202%20%2a%20PIXEL_SIZE%2C%204%20%2a%20PIXEL_SIZE%29%3B%0A%0A%09%2F%2F%20print%20training%20and%20validation%20results%20to%20console%0A%09console.log%28%22%7C%7C%20%22%20%2B%20epoch.toString%28%29.padStart%286%2C%20%22%20%22%29%20%2B%20%22%20%7C%7C%20%22%20%2B%20trainCorrect.correct.toString%28%29.padStart%286%2C%20%22%20%22%29%20%2B%20%22%25%20%7C%20%22%20%2B%20trainCorrect.rejected.toString%28%29.padStart%287%2C%20%22%20%22%29%20%2B%20%22%25%20%7C%7C%20%22%20%2B%20validCorrect.correct.toString%28%29.padStart%286%2C%20%22%20%22%29%20%2B%20%22%25%20%7C%20%22%20%2B%20validCorrect.rejected.toString%28%29.padStart%287%2C%20%22%20%22%29%20%2B%20%22%25%20%7C%7C%22%29%3B%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20draw%20data%20in%20graphic%20buffer%0A%2F%2F%0Afunction%20drawDataInBuffer%28inputData%2C%20outputData%2C%20buffer%29%20%7B%0A%09buffer.noFill%28%29%3B%0A%09buffer.strokeWeight%28PIXEL_SIZE%20%2F%202%29%3B%0A%09buffer.rect%280%2C%200%2C%20DATA_WINDOW_SIZE%2C%20DATA_WINDOW_SIZE%29%3B%0A%09for%20%28i%20%3D%200%3B%20i%20%3C%20inputData.length%3B%20i%2B%2B%29%20%7B%0A%09%09if%20%28outputData%5Bi%5D%20%3D%3D%3D%201%29%20%7B%0A%09%09%09%2F%2F%20green%20circle%20for%20output%20lable%20%3D%3D%3D%201%0A%09%09%09buffer.stroke%28%22darkgreen%22%29%3B%0A%09%09%09buffer.circle%28DATA_SCALE%20%2a%20inputData%5Bi%5D%5B0%5D%2C%20DATA_SCALE%20%2a%20%2810%20-%20inputData%5Bi%5D%5B1%5D%29%2C%202%20%2a%20PIXEL_SIZE%29%3B%0A%09%09%7D%20else%20%7B%0A%09%09%09%2F%2F%20blue%20cross%20for%20output%20lable%20%3D%3D%3D%200%0A%09%09%09buffer.stroke%28%22blue%22%29%3B%0A%09%09%09buffer.line%28DATA_SCALE%20%2a%20inputData%5Bi%5D%5B0%5D%20%2B%20PIXEL_SIZE%2C%20DATA_SCALE%20%2a%20%2810%20-%20inputData%5Bi%5D%5B1%5D%29%20%2B%20PIXEL_SIZE%2C%20DATA_SCALE%20%2a%20inputData%5Bi%5D%5B0%5D%20-%20PIXEL_SIZE%2C%20DATA_SCALE%20%2a%20%2810%20-%20inputData%5Bi%5D%5B1%5D%29%20-%20PIXEL_SIZE%29%3B%0A%09%09%09buffer.line%28DATA_SCALE%20%2a%20inputData%5Bi%5D%5B0%5D%20%2B%20PIXEL_SIZE%2C%20DATA_SCALE%20%2a%20%2810%20-%20inputData%5Bi%5D%5B1%5D%29%20-%20PIXEL_SIZE%2C%20DATA_SCALE%20%2a%20inputData%5Bi%5D%5B0%5D%20-%20PIXEL_SIZE%2C%20DATA_SCALE%20%2a%20%2810%20-%20inputData%5Bi%5D%5B1%5D%29%20%2B%20PIXEL_SIZE%29%3B%0A%09%09%7D%0A%09%7D%0A%7D%0A%0A%0A%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%2F%2F%20MAIN%20PROGRAM%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%0A%0A%2F%2F%0A%2F%2F%20p5.js%20setup%28%29%0A%2F%2F%0Aasync%20function%20setup%28%29%20%7B%20%2F%2Fnoprotect%20%28for%20large%20arrays%29%0A%09%2F%2F%20initiate%20console%20output%0A%09console.log%28%22%7C%7C%20%20%20%20%20%20%20%20%7C%7C%20%20%20%20%20%20Training%20%20%20%20%20%20%7C%7C%20%20%20%20%20Validation%20%20%20%20%20%7C%7C%22%29%3B%0A%09console.log%28%22%7C%7C%20Epoche%20%7C%7C%20korrekt%20%7C%20rejected%20%7C%7C%20korrekt%20%7C%20rejected%20%7C%7C%22%29%3B%0A%0A%09%2F%2F%20create%20canvas%0A%09createCanvas%282%20%2a%20DATA_WINDOW_SIZE%2C%20DATA_WINDOW_SIZE%29%3B%0A%09textSize%28PIXEL_SIZE%20%2a%203%29%3B%0A%0A%09%2F%2F%20create%20all%20grafic%20buffers%0A%09trainBuffer%20%3D%20createGraphics%28DATA_WINDOW_SIZE%2C%20DATA_WINDOW_SIZE%29%3B%0A%09validBuffer%20%3D%20createGraphics%28DATA_WINDOW_SIZE%2C%20DATA_WINDOW_SIZE%29%3B%0A%09decisionBuffer%20%3D%20createGraphics%28DATA_WINDOW_SIZE%2C%20DATA_WINDOW_SIZE%29%3B%0A%0A%09%2F%2F%20draw%20initial%20training%20and%20validation%20buffer%0A%09drawDataInBuffer%28trainInputArray%2C%20trainOutputArray%2C%20trainBuffer%29%3B%0A%09drawDataInBuffer%28validInputArray%2C%20validOutputArray%2C%20validBuffer%29%3B%0A%09image%28trainBuffer%2C%200%2C%200%29%3B%0A%09image%28validBuffer%2C%20DATA_WINDOW_SIZE%2C%200%29%3B%0A%0A%09%2F%2F%20data%20preprocessing%0A%09generateTensors%28%29%3B%0A%0A%09%2F%2F%20define%20model%20and%20training%0A%09compileModel%28%29%3B%0A%0A%09%2F%2F%20train%20and%20visualise%20neural%20network%0A%09await%20trainModel%28%29%3B%0A%0A%09%2F%2F%20end%20of%20training%0A%09console.log%28%22Das%20Training%20ist%20beendet%20%3A-%29%22%29%3B%0A%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20p5.js%20keyPressed%28%29%20ESC%20%3D%20emergency%20stop%0A%2F%2F%0Afunction%20keyPressed%28%29%20%7B%0A%09if%20%28keyCode%20%3D%3D%3D%2027%29%20%7B%20%2F%2F%20ESC%20key%0A%09%09%2F%2F%20initiate%20stop%20of%20training%20after%20next%20epoch%0A%09%09model.stopTraining%20%3D%20true%3B%0A%09%09%2F%2F%20response%20to%20user%0A%09%09console.log%28%22Training%20wurde%20Abgebrochen%21%20Finales%20Resultat%3A%22%29%3B%0A%09%09%2F%2F%20draw%20final%20Prediction%0A%09%09drawPrediction%28actualEpoch%2C%20actualLogs.loss%29%3B%0A%09%7D%0A%7D&css=undefined&html=%3Cscript%20src%3D%22https%3A%2F%2Fapp.exorciser.ch%2Flib%2Fp5.js%22%3E%3C%2Fscript%3E%0A%3Cscript%20src%3D%22https%3A%2F%2Fcdn.jsdelivr.net%2Fnpm%2F%40tensorflow%2Ftfjs%40latest%2Fdist%2Ftf.min.js%22%3E%3C%2Fscript%3E&autorun=off&height=400px#OverlapDetection}} | {{exorciser/jspg?javascript=%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%0A%2F%2F%20Diese%20Trainings-%20und%20Updateparameter%20d%C3%BCrfen%20ge%C3%A4ndert%20werden.%0Aconst%20LERNRATE%20%3D%201%3B%20%2F%2F%20Dezimalzahl%20%3E%200%0Aconst%20ANZAHL_HIDDEN_NEURONS%20%3D%203%3B%20%2F%2F%20ganzzahliger%20Wert%20%3E%200%0Aconst%20ANZAHL_EPOCHEN%20%3D%202000%3B%20%2F%2F%20ganzzahliger%20Wert%20%3E%200%0Aconst%20EPOCHEN_FUER_GRAFIK_UPDATE%20%3D%20100%3B%20%2F%2F%20ganzzahlig%20Wert%20%3E%200%0Aconst%20GRENZWERT%20%3D%200.3%3B%20%2F%2F%20Dezimalzahl%20%3E%200%0A%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%0A%0A%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%2F%2F%20CONSTANTS%20AND%20GLOBAL%20VARIABLES%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%0A%0A%2F%2F%20constants%0Aconst%20DATA_RANGE%20%3D%2010%3B%0Aconst%20DATA_WINDOW_SIZE%20%3D%20200%3B%0Aconst%20DATA_SCALE%20%3D%20Math.round%28DATA_WINDOW_SIZE%20%2F%20DATA_RANGE%29%3B%0Aconst%20NUM_DATA_PIXEL%20%3D%2050%3B%0Aconst%20PIXEL_SIZE%20%3D%20Math.round%28DATA_WINDOW_SIZE%20%2F%20NUM_DATA_PIXEL%29%3B%0A%0A%2F%2F%20training%20data%0Aconst%20trainInputArray%20%3D%20%5B%0A%09%5B2.5%2C%206.0%5D%2C%0A%09%5B3.5%2C%201.5%5D%2C%0A%09%5B3.5%2C%204.0%5D%2C%0A%09%5B4.0%2C%206.0%5D%2C%0A%09%5B4.0%2C%207.0%5D%2C%0A%09%5B4.5%2C%203.0%5D%2C%0A%09%5B5.0%2C%205.0%5D%2C%0A%09%5B5.5%2C%206.0%5D%2C%0A%09%5B6.5%2C%203.0%5D%2C%0A%09%5B7.0%2C%205.5%5D%2C%0A%09%5B7.5%2C%204.0%5D%2C%0A%09%5B8.5%2C%205.5%5D%2C%0A%09%5B1.5%2C%203.0%5D%2C%0A%09%5B1.5%2C%204.5%5D%2C%0A%09%5B1.5%2C%207.0%5D%2C%0A%09%5B2.0%2C%201.5%5D%2C%0A%09%5B3.0%2C%203.0%5D%2C%0A%09%5B3.0%2C%205.5%5D%2C%0A%09%5B3.0%2C%206.5%5D%2C%0A%09%5B4.0%2C%208.5%5D%2C%0A%09%5B4.5%2C%206.5%5D%2C%0A%09%5B6.5%2C%207.5%5D%2C%0A%09%5B8.0%2C%206.5%5D%2C%0A%09%5B8.0%2C%208.5%5D%0A%5D%3B%0Aconst%20trainOutputArray%20%3D%20%5B0%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%5D%3B%0Aconst%20trainInputMax%20%3D%20%5B9.0%2C%208.5%5D%3B%0Aconst%20trainInputMin%20%3D%20%5B1.5%2C%201.5%5D%3B%0A%0A%2F%2F%20validation%20data%0Aconst%20validInputArray%20%3D%20%5B%0A%09%5B2.5%2C%207.0%5D%2C%0A%09%5B3.5%2C%201.0%5D%2C%0A%09%5B3.5%2C%207.0%5D%2C%0A%09%5B4.0%2C%203.5%5D%2C%0A%09%5B4.5%2C%206.5%5D%2C%0A%09%5B4.5%2C%202.5%5D%2C%0A%09%5B4.5%2C%205.0%5D%2C%0A%09%5B6.0%2C%202.5%5D%2C%0A%09%5B6.0%2C%204.5%5D%2C%0A%09%5B6.5%2C%205.5%5D%2C%0A%09%5B7.5%2C%204.5%5D%2C%0A%09%5B8.5%2C%205.0%5D%2C%0A%09%5B1.5%2C%205.0%5D%2C%0A%09%5B1.5%2C%206.5%5D%2C%0A%09%5B2.0%2C%201.5%5D%2C%0A%09%5B2.5%2C%203.5%5D%2C%0A%09%5B2.5%2C%206.0%5D%2C%0A%09%5B3.5%2C%206.0%5D%2C%0A%09%5B4.0%2C%208.0%5D%2C%0A%09%5B4.0%2C%207.0%5D%2C%0A%09%5B5.5%2C%208.5%5D%2C%0A%09%5B6.5%2C%207.0%5D%2C%0A%09%5B7.5%2C%208.5%5D%2C%0A%09%5B8.5%2C%207.0%5D%0A%5D%3B%0Aconst%20validOutputArray%20%3D%20%5B0%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%5D%3B%0A%0A%2F%2F%20global%20variables%0Alet%20model%2C%20trainInput%2C%20trainOutput%2C%20validInput%2C%20validOutput%2C%20testInput%2C%20actualEpoch%2C%20actualLogs%2C%20trainBuffer%2C%20validBuffer%2C%20decisionBuffer%3B%0A%0A%0A%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%2F%2F%20NEURAL%20NETWORK%20FUNCTIONS%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%0A%0A%2F%2F%0A%2F%2F%20generate%20data%20tensors%0A%2F%2F%0Afunction%20generateTensors%28%29%20%7B%0A%09let%20normalizedTrainInputArray%20%3D%20%5B%5D%3B%0A%09let%20normalizedValidInputArray%20%3D%20%5B%5D%3B%0A%09let%20normalizedTestInputArray%20%3D%20%5B%5D%3B%0A%0A%09%2F%2F%20normalize%20training%20and%20validation%20inputs%0A%09for%20%28i%20%3D%200%3B%20i%20%3C%20trainInputArray.length%3B%20i%2B%2B%29%20%7B%0A%09%09normalizedTrainInputArray.push%28%5B%28trainInputArray%5Bi%5D%5B0%5D%20-%20trainInputMin%5B0%5D%29%20%2F%20%28trainInputMax%5B0%5D%20-%20trainInputMin%5B0%5D%29%2C%20%28trainInputArray%5Bi%5D%5B1%5D%20-%20trainInputMin%5B1%5D%29%20%2F%20%28trainInputMax%5B1%5D%20-%20trainInputMin%5B1%5D%29%5D%29%3B%0A%09%09normalizedValidInputArray.push%28%5B%28validInputArray%5Bi%5D%5B0%5D%20-%20trainInputMin%5B0%5D%29%20%2F%20%28trainInputMax%5B0%5D%20-%20trainInputMin%5B0%5D%29%2C%20%28validInputArray%5Bi%5D%5B1%5D%20-%20trainInputMin%5B1%5D%29%20%2F%20%28trainInputMax%5B1%5D%20-%20trainInputMin%5B1%5D%29%5D%29%3B%0A%09%7D%0A%0A%09%2F%2F%20generate%20training%20input%20and%20output%20tensors%0A%09trainInput%20%3D%20tf.tensor2d%28normalizedTrainInputArray%2C%20%5BnormalizedTrainInputArray.length%2C%202%5D%29%3B%0A%09trainOutput%20%3D%20tf.tensor2d%28trainOutputArray%2C%20%5BtrainOutputArray.length%2C%201%5D%29%3B%0A%09%2F%2F%20let%20trainOutput%20%3D%20tf.oneHot%28tf.tensor1d%28trainOutputArray%29.toInt%28%29%2C%202%29%3B%0A%09%2F%2F%20trainInput.print%28%29%3B%20%2F%2F%20Print%20Tensor%0A%0A%09%2F%2F%20generate%20validation%20input%20and%20output%20tensors%0A%09validInput%20%3D%20tf.tensor2d%28normalizedValidInputArray%2C%20%5BnormalizedValidInputArray.length%2C%202%5D%29%3B%0A%09validOutput%20%3D%20tf.tensor2d%28validOutputArray%2C%20%5BvalidOutputArray.length%2C%201%5D%29%3B%0A%09%2F%2F%20let%20validOutput%20%3D%20tf.oneHot%28tf.tensor1d%28validOutputArray%29.toInt%28%29%2C%202%29%3B%0A%0A%09%2F%2F%20calculate%20normalized%20testing%20inputs%20for%20visualisation%0A%09for%20%28i%20%3D%200%3B%20i%20%3C%20NUM_DATA_PIXEL%20%2B%201%3B%20i%20%3D%20i%20%2B%201%29%20%7B%0A%09%09for%20%28j%20%3D%200%3B%20j%20%3C%20NUM_DATA_PIXEL%20%2B%201%3B%20j%20%3D%20j%20%2B%201%29%20%7B%0A%09%09%09normalizedTestInputArray.push%28%5B%28i%20%2F%20NUM_DATA_PIXEL%20%2a%20DATA_RANGE%20-%20trainInputMin%5B0%5D%29%20%2F%20%28trainInputMax%5B0%5D%20-%20trainInputMin%5B0%5D%29%2C%20%28j%20%2F%20NUM_DATA_PIXEL%20%2a%20DATA_RANGE%20-%20trainInputMin%5B1%5D%29%20%2F%20%28trainInputMax%5B1%5D%20-%20trainInputMin%5B1%5D%29%5D%29%3B%0A%09%09%7D%0A%09%7D%0A%0A%09%2F%2F%20generate%20testing%20input%20tensor%20for%20visualisation%0A%09testInput%20%3D%20tf.tensor2d%28normalizedTestInputArray%2C%20%5BnormalizedTestInputArray.length%2C%202%5D%29%3B%0A%09%2F%2F%09testInput.print%28%29%3B%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20build%20neural%20network%20model%20and%20define%20training%0A%2F%2F%0Afunction%20compileModel%28%29%20%7B%0A%09%2F%2F%20neural%20network%20structure%0A%09model%20%3D%20tf.sequential%28%7B%0A%09%09layers%3A%20%5B%0A%09%09%09tf.layers.dense%28%7B%0A%09%09%09%09name%3A%20%27HiddenLayer1%27%2C%0A%09%09%09%09inputShape%3A%20%5B2%5D%2C%0A%09%09%09%09units%3A%20ANZAHL_HIDDEN_NEURONS%2C%0A%09%09%09%09activation%3A%20%27tanh%27%0A%09%09%09%7D%29%2C%0A%09%09%09tf.layers.dense%28%7B%0A%09%09%09%09name%3A%20%27OutputLayer%27%2C%0A%09%09%09%09units%3A%201%2C%0A%09%09%09%09activation%3A%20%27sigmoid%27%0A%09%09%09%7D%29%0A%09%09%5D%0A%09%7D%29%3B%0A%0A%09%2F%2F%20neural%20network%20training%0A%09model.compile%28%7B%0A%09%09optimizer%3A%20tf.train.sgd%28LERNRATE%29%2C%0A%09%09loss%3A%20tf.losses.meanSquaredError%2C%0A%09%09metrics%3A%20%5B%27mse%27%5D%2C%0A%09%7D%29%3B%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20train%20neural%20network%0A%2F%2F%0Aasync%20function%20trainModel%28%29%20%7B%0A%09await%20model.fit%28%0A%09%09trainInput%2C%20trainOutput%2C%20%7B%0A%09%09%09epochs%3A%20ANZAHL_EPOCHEN%2C%0A%09%09%09shuffle%3A%20true%2C%0A%09%09%09callbacks%3A%20%5B%7B%0A%09%09%09%09onEpochEnd%3A%20async%28epoch%2C%20logs%29%20%3D%3E%20%7B%0A%09%09%09%09%09%2F%2F%20remember%20epoch%20number%20if%20interrupted%0A%09%09%09%09%09actualEpoch%20%3D%20epoch%20%2B%201%3B%0A%09%09%09%09%09actualLogs%20%3D%20logs%3B%0A%09%09%09%09%09%2F%2F%20initiate%20graphic%20update%0A%09%09%09%09%09if%20%28%28%28actualEpoch%29%20%25%20EPOCHEN_FUER_GRAFIK_UPDATE%20%3D%3D%3D%200%29%20%7C%7C%20%28epoch%20%3D%3D%3D%200%29%29%20%7B%0A%09%09%09%09%09%09drawPrediction%28actualEpoch%2C%20logs.loss%29%3B%0A%09%09%09%09%09%7D%0A%09%09%09%09%7D%0A%09%09%09%7D%2C%20%5D%0A%09%09%7D%0A%09%29%3B%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20calculate%20percentage%20of%20correct%20classifications%0A%2F%2F%0Afunction%20calculatePercentageCorrect%28predictedOutput%2C%20trueOutput%29%20%7B%0A%09let%20correct%20%3D%200%3B%0A%09let%20rejected%20%3D%200%3B%0A%09for%20%28i%20%3D%200%3B%20i%20%3C%20predictedOutput.length%3B%20i%2B%2B%29%20%7B%0A%09%09if%20%28predictedOutput%5Bi%5D%20%3C%20%281%20-%20GRENZWERT%29%20%26%26%20predictedOutput%5Bi%5D%20%3E%20GRENZWERT%29%20%7B%0A%09%09%09rejected%20%3D%20rejected%20%2B%201%3B%0A%09%09%7D%20else%20%7B%0A%09%09%09if%20%28%28trueOutput%5Bi%5D%20%3D%3D%3D%201%20%26%26%20predictedOutput%5Bi%5D%20%3E%3D%200.5%29%20%7C%7C%20%28trueOutput%5Bi%5D%20%3D%3D%3D%200%20%26%26%20predictedOutput%5Bi%5D%20%3C%200.5%29%29%20%7B%0A%09%09%09%09correct%20%3D%20correct%20%2B%201%3B%0A%09%09%09%7D%0A%09%09%7D%0A%09%7D%0A%09return%20%7B%0A%09%09correct%3A%20Math.round%28correct%20%2F%20%28predictedOutput.length%20-%20rejected%29%20%2a%20100%29%2C%0A%09%09rejected%3A%20Math.round%28rejected%20%2F%20predictedOutput.length%20%2a%20100%29%0A%09%7D%3B%0A%7D%0A%0A%0A%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%2F%2F%20FUNCTIONS%20FOR%20VISUALISATION%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%0A%0A%2F%2F%0A%2F%2F%20decision%20boundary%20and%20network%20output%0A%2F%2F%0Afunction%20drawPrediction%28epoch%2C%20mseTrain%29%20%7B%0A%09%2F%2F%20make%20predictions%20with%20neural%20network%0A%09let%20training%20%3D%20model.predict%28trainInput%29.arraySync%28%29%3B%0A%09let%20validation%20%3D%20model.predict%28validInput%29.arraySync%28%29%3B%0A%09let%20prediction%20%3D%20model.predict%28testInput%29.arraySync%28%29%3B%0A%0A%09%2F%2F%20calculate%20mse%20and%20percentages%20of%20correct%20classifications%0A%09let%20trainCorrect%20%3D%20calculatePercentageCorrect%28training%2C%20trainOutputArray%29%3B%0A%09let%20validCorrect%20%3D%20calculatePercentageCorrect%28validation%2C%20validOutputArray%29%3B%0A%0A%09%2F%2F%20decision%20boundary%20and%20input%20feature%20space%0A%09decisionBuffer.noStroke%28%29%3B%0A%09let%20element%20%3D%200%3B%0A%09for%20%28i%20%3D%200%3B%20i%20%3C%20NUM_DATA_PIXEL%20%2B%201%3B%20i%20%3D%20i%20%2B%201%29%20%7B%0A%09%09for%20%28j%20%3D%200%3B%20j%20%3C%20NUM_DATA_PIXEL%20%2B%201%3B%20j%20%3D%20j%20%2B%201%29%20%7B%0A%09%09%09%2F%2F%20transform%20neural%20network%20output%20into%20a%20color%0A%09%09%09if%20%28prediction%5Belement%5D%5B0%5D%20%3C%20%281%20-%20GRENZWERT%29%20%26%26%20prediction%5Belement%5D%5B0%5D%20%3E%20GRENZWERT%29%20%7B%0A%09%09%09%09decisionBuffer.fill%28%22white%22%29%3B%0A%09%09%09%7D%20else%20%7B%0A%09%09%09%09if%20%28prediction%5Belement%5D%5B0%5D%20%3E%200.5%29%20%7B%0A%09%09%09%09%09decisionBuffer.fill%28%22lightgreen%22%29%3B%0A%09%09%09%09%7D%20else%20%7B%0A%09%09%09%09%09decisionBuffer.fill%28%22lightblue%22%29%3B%0A%09%09%09%09%7D%0A%09%09%09%7D%0A%09%09%09%2F%2F%20check%20for%20decision%20boundary%20and%20alter%20color%0A%09%09%09if%20%28%28element%20%25%20%28NUM_DATA_PIXEL%20%2B%201%29%29%20%21%3D%3D%200%20%26%26%20%28%28prediction%5Belement%5D%5B0%5D%20%3E%200.5%20%26%26%20prediction%5Belement%20-%201%5D%5B0%5D%20%3C%3D%200.5%29%20%7C%7C%20%28prediction%5Belement%5D%5B0%5D%20%3C%3D%200.5%20%26%26%20prediction%5Belement%20-%201%5D%5B0%5D%20%3E%200.5%29%29%29%20%7B%0A%09%09%09%09decisionBuffer.fill%28%27red%27%29%3B%0A%09%09%09%7D%0A%09%09%09if%20%28element%20%3E%3D%20NUM_DATA_PIXEL%20%2B%201%20%26%26%20%28%28prediction%5Belement%5D%5B0%5D%20%3E%200.5%20%26%26%20prediction%5Belement%20-%20%28NUM_DATA_PIXEL%20%2B%201%29%5D%5B0%5D%20%3C%3D%200.5%29%20%7C%7C%20%28prediction%5Belement%5D%5B0%5D%20%3C%3D%200.5%20%26%26%20prediction%5Belement%20-%20%28NUM_DATA_PIXEL%20%2B%201%29%5D%5B0%5D%20%3E%200.5%29%29%29%20%7B%0A%09%09%09%09decisionBuffer.fill%28%27red%27%29%3B%0A%09%09%09%7D%0A%09%09%09decisionBuffer.rect%28DATA_SCALE%20%2a%20i%20%2F%20NUM_DATA_PIXEL%20%2a%20DATA_RANGE%20-%20PIXEL_SIZE%20%2F%202%2C%20DATA_SCALE%20%2a%20%2810%20-%20j%20%2F%20NUM_DATA_PIXEL%20%2a%20DATA_RANGE%29%20-%20PIXEL_SIZE%20%2F%202%2C%20PIXEL_SIZE%2C%20PIXEL_SIZE%29%3B%0A%09%09%09element%20%3D%20element%20%2B%201%3B%0A%09%09%7D%0A%09%7D%0A%09image%28decisionBuffer%2C%200%2C%200%29%3B%0A%09image%28decisionBuffer%2C%20DATA_WINDOW_SIZE%2C%200%29%3B%0A%0A%09%2F%2F%20draw%20training%20and%20validation%20samples%0A%09image%28trainBuffer%2C%200%2C%200%29%3B%0A%09image%28validBuffer%2C%20DATA_WINDOW_SIZE%2C%200%29%3B%0A%0A%09%2F%2F%20add%20lables%20to%20training%20and%20validation%20feature%20space%0A%09noStroke%28%29%3B%0A%09text%28%22Training%3A%20%22%20%2B%20trainCorrect.correct%20%2B%20%22%25%20%E2%9C%94%EF%B8%8F%EF%B8%8F%2C%20%22%20%2B%20trainCorrect.rejected%20%2B%20%22%25%20%F0%9F%97%91%22%2C%202%20%2a%20PIXEL_SIZE%2C%204%20%2a%20PIXEL_SIZE%29%3B%0A%09text%28%22Validation%3A%20%22%20%2B%20validCorrect.correct%20%2B%20%22%25%20%E2%9C%94%EF%B8%8F%2C%20%22%20%2B%20validCorrect.rejected%20%2B%20%22%25%20%F0%9F%97%91%22%2C%20DATA_WINDOW_SIZE%20%2B%202%20%2a%20PIXEL_SIZE%2C%204%20%2a%20PIXEL_SIZE%29%3B%0A%0A%09%2F%2F%20print%20training%20and%20validation%20results%20to%20console%0A%09console.log%28%22%7C%7C%20%22%20%2B%20epoch.toString%28%29.padStart%286%2C%20%22%20%22%29%20%2B%20%22%20%7C%7C%20%22%20%2B%20trainCorrect.correct.toString%28%29.padStart%286%2C%20%22%20%22%29%20%2B%20%22%25%20%7C%20%22%20%2B%20trainCorrect.rejected.toString%28%29.padStart%287%2C%20%22%20%22%29%20%2B%20%22%25%20%7C%7C%20%22%20%2B%20validCorrect.correct.toString%28%29.padStart%286%2C%20%22%20%22%29%20%2B%20%22%25%20%7C%20%22%20%2B%20validCorrect.rejected.toString%28%29.padStart%287%2C%20%22%20%22%29%20%2B%20%22%25%20%7C%7C%22%29%3B%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20draw%20data%20in%20graphic%20buffer%0A%2F%2F%0Afunction%20drawDataInBuffer%28inputData%2C%20outputData%2C%20buffer%29%20%7B%0A%09buffer.noFill%28%29%3B%0A%09buffer.strokeWeight%28PIXEL_SIZE%20%2F%202%29%3B%0A%09buffer.rect%280%2C%200%2C%20DATA_WINDOW_SIZE%2C%20DATA_WINDOW_SIZE%29%3B%0A%09for%20%28i%20%3D%200%3B%20i%20%3C%20inputData.length%3B%20i%2B%2B%29%20%7B%0A%09%09if%20%28outputData%5Bi%5D%20%3D%3D%3D%201%29%20%7B%0A%09%09%09%2F%2F%20green%20circle%20for%20output%20lable%20%3D%3D%3D%201%0A%09%09%09buffer.stroke%28%22darkgreen%22%29%3B%0A%09%09%09buffer.circle%28DATA_SCALE%20%2a%20inputData%5Bi%5D%5B0%5D%2C%20DATA_SCALE%20%2a%20%2810%20-%20inputData%5Bi%5D%5B1%5D%29%2C%202%20%2a%20PIXEL_SIZE%29%3B%0A%09%09%7D%20else%20%7B%0A%09%09%09%2F%2F%20blue%20cross%20for%20output%20lable%20%3D%3D%3D%200%0A%09%09%09buffer.stroke%28%22blue%22%29%3B%0A%09%09%09buffer.line%28DATA_SCALE%20%2a%20inputData%5Bi%5D%5B0%5D%20%2B%20PIXEL_SIZE%2C%20DATA_SCALE%20%2a%20%2810%20-%20inputData%5Bi%5D%5B1%5D%29%20%2B%20PIXEL_SIZE%2C%20DATA_SCALE%20%2a%20inputData%5Bi%5D%5B0%5D%20-%20PIXEL_SIZE%2C%20DATA_SCALE%20%2a%20%2810%20-%20inputData%5Bi%5D%5B1%5D%29%20-%20PIXEL_SIZE%29%3B%0A%09%09%09buffer.line%28DATA_SCALE%20%2a%20inputData%5Bi%5D%5B0%5D%20%2B%20PIXEL_SIZE%2C%20DATA_SCALE%20%2a%20%2810%20-%20inputData%5Bi%5D%5B1%5D%29%20-%20PIXEL_SIZE%2C%20DATA_SCALE%20%2a%20inputData%5Bi%5D%5B0%5D%20-%20PIXEL_SIZE%2C%20DATA_SCALE%20%2a%20%2810%20-%20inputData%5Bi%5D%5B1%5D%29%20%2B%20PIXEL_SIZE%29%3B%0A%09%09%7D%0A%09%7D%0A%7D%0A%0A%0A%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%2F%2F%20MAIN%20PROGRAM%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%0A%0A%2F%2F%0A%2F%2F%20p5.js%20setup%28%29%0A%2F%2F%0Aasync%20function%20setup%28%29%20%7B%20%2F%2Fnoprotect%20%28for%20large%20arrays%29%0A%09%2F%2F%20initiate%20console%20output%0A%09console.log%28%22%7C%7C%20%20%20%20%20%20%20%20%7C%7C%20%20%20%20%20%20Training%20%20%20%20%20%20%7C%7C%20%20%20%20%20Validation%20%20%20%20%20%7C%7C%22%29%3B%0A%09console.log%28%22%7C%7C%20Epoche%20%7C%7C%20korrekt%20%7C%20rejected%20%7C%7C%20korrekt%20%7C%20rejected%20%7C%7C%22%29%3B%0A%0A%09%2F%2F%20create%20canvas%0A%09createCanvas%282%20%2a%20DATA_WINDOW_SIZE%2C%20DATA_WINDOW_SIZE%29%3B%0A%09textSize%28PIXEL_SIZE%20%2a%203%29%3B%0A%0A%09%2F%2F%20create%20all%20grafic%20buffers%0A%09trainBuffer%20%3D%20createGraphics%28DATA_WINDOW_SIZE%2C%20DATA_WINDOW_SIZE%29%3B%0A%09validBuffer%20%3D%20createGraphics%28DATA_WINDOW_SIZE%2C%20DATA_WINDOW_SIZE%29%3B%0A%09decisionBuffer%20%3D%20createGraphics%28DATA_WINDOW_SIZE%2C%20DATA_WINDOW_SIZE%29%3B%0A%0A%09%2F%2F%20draw%20initial%20training%20and%20validation%20buffer%0A%09drawDataInBuffer%28trainInputArray%2C%20trainOutputArray%2C%20trainBuffer%29%3B%0A%09drawDataInBuffer%28validInputArray%2C%20validOutputArray%2C%20validBuffer%29%3B%0A%09image%28trainBuffer%2C%200%2C%200%29%3B%0A%09image%28validBuffer%2C%20DATA_WINDOW_SIZE%2C%200%29%3B%0A%0A%09%2F%2F%20data%20preprocessing%0A%09generateTensors%28%29%3B%0A%0A%09%2F%2F%20define%20model%20and%20training%0A%09compileModel%28%29%3B%0A%0A%09%2F%2F%20train%20and%20visualise%20neural%20network%0A%09await%20trainModel%28%29%3B%0A%0A%09%2F%2F%20end%20of%20training%0A%09console.log%28%22Das%20Training%20ist%20beendet%20%3A-%29%22%29%3B%0A%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20p5.js%20keyPressed%28%29%20ESC%20%3D%20emergency%20stop%0A%2F%2F%0Afunction%20keyPressed%28%29%20%7B%0A%09if%20%28keyCode%20%3D%3D%3D%2027%29%20%7B%20%2F%2F%20ESC%20key%0A%09%09%2F%2F%20initiate%20stop%20of%20training%20after%20next%20epoch%0A%09%09model.stopTraining%20%3D%20true%3B%0A%09%09%2F%2F%20response%20to%20user%0A%09%09console.log%28%22Training%20wurde%20Abgebrochen%21%20Finales%20Resultat%3A%22%29%3B%0A%09%09%2F%2F%20draw%20final%20Prediction%0A%09%09drawPrediction%28actualEpoch%2C%20actualLogs.loss%29%3B%0A%09%7D%0A%7D&css=undefined&html=%3Cscript%20src%3D%22https%3A%2F%2Fapp.exorciser.ch%2Flib%2Fp5.js%22%3E%3C%2Fscript%3E%0A%3Cscript%20src%3D%22https%3A%2F%2Fcdn.jsdelivr.net%2Fnpm%2F%40tensorflow%2Ftfjs%40latest%2Fdist%2Ftf.min.js%22%3E%3C%2Fscript%3E&autorun=off&height=400px#OverlapDetection}} |
| </WRAP> | </WRAP> |
| |
| |
| ++++Unsere Einschätzung|KI-Systeme wie die Fischklassifikation oder KI-Chat-Anwendungen können erstaunlich gute Resultate liefern, da ist sehr wahrscheinlich noch viel zu erwarten. Jedoch werden solche Systeme auch in Zukunft praktisch nie völlig fehlerfrei arbeiten und warum ein solches System etwas entscheidet, oder ausgibt, werden wir vermutlich auch in Zukunft nicht vollständig nachvollziehen können.\\ \\ | ++++Unsere Einschätzung|KI-Systeme wie die Fischklassifikation oder KI-Chat-Anwendungen können erstaunlich gute Resultate liefern, da ist sehr wahrscheinlich noch viel zu erwarten. Jedoch werden solche Systeme auch in Zukunft praktisch nie völlig fehlerfrei arbeiten und warum ein solches System etwas entscheidet, oder ausgibt, werden wir vermutlich auch in Zukunft nicht vollständig nachvollziehen können.\\ \\ |
| Wir Menschen wählen Daten, Eingangsgrössen, Verfahren, Anzahl Gewichte, Fehlerwerte und Thresholds aus. Wir Menschen bestimmen, wie mit den Resultaten, die eine KI produziert, umgegangen wird. Somit sind wir für unsere KIs und deren Bias auch verantwortlich.++++ | Wir Menschen wählen Daten, Eingangsgrössen, Verfahren, Anzahl Gewichte, Fehlerwerte und Grenzwerte aus. Wir Menschen bestimmen, wie mit den Resultaten, die eine KI produziert, umgegangen wird. Somit sind wir für unsere KIs und deren Bias auch verantwortlich.++++ |
| </WRAP> | </WRAP> |
| |