{{gem/mgr}}{{ gem/pageinfo}} ====== ➡️ Zusammenhänge erlernen ====== 🎯 In diesem Kapitel untersuchst du, wie Zusammenhänge mithilfe eines neuronalen Netzes erlernt werden können. ~~INTOC~~ ===== - Kugelstossen ===== [{{ :p:pasted:kugelstoss_small.png|Kugelstoss ((eigene Darstellung, [[https://creativecommons.org/publicdomain/zero/1.0/deed.de|CC0 1.0]])) }}] Beim Kugelstossen wird eine Kugel (Männer: 7.260 kg, Frauen 4.0 kg) möglichst weit gestossen. Wie genau die Kugel fliegt, lässt sich mit den Bewegungsgleichungen der Physik berechnen (für Details siehe, z.B. [[wpde>Wurfparabel]]). In der Abbildung ist der aktuelle Kugelstossweltrekord der Männer 23.56 m dargestellt. Wird der Luftwiderstand nicht berücksichtigt, hängt die Weite nur von der Abwurfgeschwindigkeit, dem Abwurfwinkel und der Abwurfhöhe ab. Unter diesen Annahmen führt eine Abwurfgeschwindigkeit von 14.5 m/s, ein Abwurfwinkel von 40° und eine Abwurfhöhe von 2.3 m (grosser Kugelstösser mit leicht nach oben gestreckten Arm) in etwa zum Weltrekord ((in Anlehnung an: [[https://science-to-go.com/leichtathletik-bessere-weiten-dank-physik/|Leichtathletik: Bessere Weiten dank Physik?]])). Mit einem neuronalen Netz wollen wir nun lernen, wie die Wurfweite von der der Abwurfgeschwindigkeit, dem Abwurfwinkel und der Abwurfhöhe abhängt. D.h. wir wollen den Zusammenhang Wurfweite, Abwurfgeschwindigkeit, Abwurfwinkel und Abwurfhöhe mit einem neuronalen Netz "modellieren". == ✍ Auftrag Kugelstossen 1== 💡 Die Kugelbewegung wurde gefilmt. Aus mehreren Standbildern wurden einzelne Positionen vermessen (Weite und Höhe der Kugel). Diese Messungen bilden die Trainingsdaten für das neuronale Netz. Die Trainingsdaten werden als blaue ☓ Kreuze dargestellt. {{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%20Parameter%20d%C3%BCrfen%20ge%C3%A4ndert%20werden.%0A%0A%2F%2F%20Neuronale%20Netz%20Parameter%0Aconst%20LERNRATE%20%3D%200.1%3B%20%2F%2F%20Dezimalzahl%20%3E%200%0Aconst%20ANZAHL_HIDDEN_NEURONS%20%3D%205%3B%20%2F%2F%20ganzzahliger%20Wert%20%3E%200%0Aconst%20ANZAHL_EPOCHEN%20%3D%201500%3B%20%2F%2F%20ganzzahliger%20Wert%20%3E%200%0A%0A%2F%2F%20Anzeigeparameter%0Aconst%20EPOCHEN_FUER_GRAFIK_UPDATE%20%3D%2050%3B%20%2F%2F%20ganzzahlig%20Wert%20%3E%200%0A%0A%2F%2F%20Wurfparameter%0Aconst%20ABWURFGESCHWINDIGKEIT%20%3D%2014.5%3B%20%2F%2F%20m%2Fs%0Aconst%20ABWURFWINKEL%20%3D%2040%3B%20%2F%2F%20%C2%B0%0Aconst%20ABWURFHOEHE%20%3D%202.3%3B%20%2F%2F%20m%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%2F%2F%20physical%20constants%0Aconst%20GRAVITY%20%3D%209.81%3B%20%2F%2F%20m%2Fs%5E2%0Aconst%20THROWING_DISTANCE%20%3D%20getThrowingDistance%28%29%3B%0A%0A%2F%2F%20options%0Aconst%20INPUT_RANGE%20%3D%20Math.floor%28THROWING_DISTANCE%29%3B%0Aconst%20INPUT_STEP%20%3D%20Math.max%280.5%2CMath.round%28THROWING_DISTANCE%2F10%29%29%3B%0Aconst%20AXIS_RANGE_X%20%3D%20Math.ceil%28THROWING_DISTANCE%29%20%2B%204%3B%0Aconst%20AXIS_RANGE_Y%20%3D%20Math.ceil%28getMaximumHeight%28%29%29%20%2B%201%3B%0Aconst%20NUM_DATA_PIXEL%20%3D%2050%3B%0Aconst%20DATA_WINDOW_SIZE_X%20%3D%20500%3B%0Aconst%20DATA_WINDOW_SIZE_Y%20%3D%20240%3B%0Aconst%20DATA_WINDOW_MARGIN%20%3D%2030%3B%0Aconst%20PIXEL_SIZE%20%3D%203%3B%0Aconst%20CROSS_SIZE%20%3D%205%3B%0Aconst%20TEXT_SIZE%20%3D%2012%3B%0A%0A%2F%2F%20global%20variables%0Alet%20model%2C%20inputSamplesMax%2C%20inputSamplesMin%2C%20outputSamplesMax%2C%20outputSamplesMin%2C%20actualEpoch%2C%20actualLogs%2C%20axesTrainingSamplesBuffer%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%20Physical%20Modelling%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%20pysical%20correct%20training%20data%0A%2F%2F%0Afunction%20generateSamples%28%29%20%7B%0A%0A%09%2F%2F%20generate%20training%20data%0A%09let%20inputSamplesArray%20%3D%20%5B%5D%3B%0A%09let%20outputSamplesArray%20%3D%20%5B%5D%3B%0A%09for%20%28let%20s%20%3D%200%3B%20s%20%3C%3D%20INPUT_RANGE%3B%20s%20%3D%20s%20%2B%20INPUT_STEP%29%20%7B%0A%09%09inputSamplesArray.push%28%5Bs%5D%29%3B%0A%09%09outputSamplesArray.push%28%5BgetHeight%28s%29%5D%29%3B%0A%09%7D%0A%0A%09%2F%2F%20calulate%20global%20normalization%20bounds%0A%09inputSamplesMax%20%3D%20Math.max.apply%28null%2C%20inputSamplesArray%29%3B%0A%09inputSamplesMin%20%3D%20Math.min.apply%28null%2C%20inputSamplesArray%29%3B%0A%09outputSamplesMax%20%3D%20Math.max.apply%28null%2C%20outputSamplesArray%29%3B%0A%09outputSamplesMin%20%3D%20Math.min.apply%28null%2C%20outputSamplesArray%29%3B%0A%0A%09%2F%2F%20generate%20testing%20data%20for%20visualization%0A%09let%20testingSamplesArray%20%3D%20%5B%5D%3B%0A%09for%20%28let%20i%20%3D%200%3B%20i%20%3C%3D%20NUM_DATA_PIXEL%3B%20i%20%3D%20i%20%2B%20AXIS_RANGE_X%20%2F%20NUM_DATA_PIXEL%29%20%7B%0A%09%09testingSamplesArray.push%28%5B%28i%20-%20inputSamplesMin%29%20%2F%20%28inputSamplesMax%20-%20inputSamplesMin%29%5D%29%3B%0A%09%7D%0A%0A%0A%09%2F%2F%20return%20input%20and%20output%20samples%0A%09return%20%5BinputSamplesArray%2C%20outputSamplesArray%2C%20testingSamplesArray%5D%3B%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20returns%20height%20given%20a%20distance%0A%2F%2F%0Afunction%20getHeight%28distance%29%20%7B%0A%0A%09return%20-GRAVITY%20%2a%20distance%20%2a%20distance%20%2F%20%282%20%2a%20ABWURFGESCHWINDIGKEIT%20%2a%20ABWURFGESCHWINDIGKEIT%20%2a%20Math.cos%28ABWURFWINKEL%20%2a%20Math.PI%20%2F%20180%29%20%2a%20Math.cos%28ABWURFWINKEL%20%2a%20Math.PI%20%2F%20180%29%29%20%2B%20Math.tan%28ABWURFWINKEL%20%2a%20Math.PI%20%2F%20180%29%20%2a%20distance%20%2B%20ABWURFHOEHE%3B%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20returns%20throwing%20distance%0A%2F%2F%0Afunction%20getThrowingDistance%28%29%20%7B%0A%0A%09return%20ABWURFGESCHWINDIGKEIT%20%2a%20ABWURFGESCHWINDIGKEIT%20%2F%20GRAVITY%20%2a%20Math.cos%28ABWURFWINKEL%20%2a%20Math.PI%20%2F%20180%29%20%2a%20%28Math.sin%28ABWURFWINKEL%20%2a%20Math.PI%20%2F%20180%29%20%2B%20Math.sqrt%28Math.sin%28ABWURFWINKEL%20%2a%20Math.PI%20%2F%20180%29%20%2a%20Math.sin%28ABWURFWINKEL%20%2a%20Math.PI%20%2F%20180%29%20%2B%202%20%2a%20GRAVITY%20%2a%20ABWURFHOEHE%20%2F%20%28ABWURFGESCHWINDIGKEIT%20%2a%20ABWURFGESCHWINDIGKEIT%29%29%29%3B%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20returns%20maximal%20height%0A%2F%2F%0Afunction%20getMaximumHeight%28%29%20%7B%0A%09return%20ABWURFGESCHWINDIGKEIT%20%2a%20ABWURFGESCHWINDIGKEIT%20%2a%20Math.sin%28ABWURFWINKEL%20%2a%20Math.PI%20%2F%20180%29%20%2a%20Math.sin%28ABWURFWINKEL%20%2a%20Math.PI%20%2F%20180%29%20%2F%20%282%20%2a%20GRAVITY%29%20%2B%20ABWURFHOEHE%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%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%28inputSamples%2C%20outputSamples%2C%20testingSamples%29%20%7B%0A%0A%09%2F%2F%20normalize%20training%20data%0A%09for%20%28let%20i%20%3D%200%3B%20i%20%3C%20inputSamples.length%3B%20i%20%3D%20i%20%2B%201%29%20%7B%0A%09%09inputSamples%5Bi%5D%5B0%5D%20%3D%20%28inputSamples%5Bi%5D%5B0%5D%20-%20inputSamplesMin%29%20%2F%20%28inputSamplesMax%20-%20inputSamplesMin%29%3B%0A%09%09outputSamples%5Bi%5D%5B0%5D%20%3D%20%28outputSamples%5Bi%5D%5B0%5D%20-%20outputSamplesMin%29%20%2F%20%28outputSamplesMax%20-%20outputSamplesMin%29%3B%0A%09%7D%0A%0A%09%2F%2F%20generate%20training%20input%20and%20output%20tensors%0A%09let%20trainingInputTensor%20%3D%20tf.tensor2d%28inputSamples%2C%20%5BinputSamples.length%2C%201%5D%29%3B%0A%09let%20trainingOutputTensor%20%3D%20tf.tensor2d%28outputSamples%2C%20%5BoutputSamples.length%2C%201%5D%29%3B%0A%09%2F%2F%20trainingOutputTensor.print%28%29%3B%20%2F%2F%20display%20tensor%20in%20the%20console%0A%0A%09%2F%2F%20generate%20testing%20input%20tensor%20for%20visualisation%0A%09let%20testingInputTensor%20%3D%20tf.tensor2d%28testingSamples%2C%20%5BtestingSamples.length%2C%201%5D%29%3B%0A%09%2F%2F%20testingInputTensor.print%28%29%3B%20%2F%2F%20display%20tensor%20in%20the%20console%0A%0A%09return%20%5BtrainingInputTensor%2C%20trainingOutputTensor%2C%20testingInputTensor%5D%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%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%5B1%5D%2C%0A%09%09%09%09units%3A%20ANZAHL_HIDDEN_NEURONS%2C%0A%09%09%09%09activation%3A%20%27sigmoid%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%27linear%27%0A%09%09%09%7D%29%0A%09%09%5D%0A%09%7D%29%3B%0A%0A%09%2F%2F%20neural%20network%20configuration%0A%09model.compile%28%7B%0A%09%09optimizer%3A%20tf.train.adam%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%28trainInput%2C%20trainOutput%2C%20testingInput%29%20%7B%0A%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%20%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%09drawApproximation%28actualEpoch%2C%20logs.loss%2C%20testingInput%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%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%2F%2F%0A%2F%2F%20decision%20boundary%20and%20network%20output%0A%2F%2F%0Afunction%20drawApproximation%28epoch%2C%20mseTrain%2C%20testingTensor%29%20%7B%0A%0A%09let%20throwingDistance%20%3D%20-1%3B%0A%0A%09%2F%2F%20calculate%20scaling%20factors%0A%09let%20stretch_x%20%3D%20DATA_WINDOW_SIZE_X%20%2F%20AXIS_RANGE_X%3B%0A%09let%20stretch_y%20%3D%20DATA_WINDOW_SIZE_Y%20%2F%20AXIS_RANGE_Y%3B%0A%0A%09%2F%2F%20calculate%20approximation%20with%20the%20current%20neural%20network%0A%09let%20prediction%20%3D%20model.predict%28testingTensor%29.arraySync%28%29%3B%0A%0A%09%2F%2F%20reset%20grafic%20and%20draw%20axes%20and%20training%20samples%0A%09background%28%22white%22%29%3B%0A%09image%28axesTrainingSamplesBuffer%2C%200%2C%200%29%3B%0A%0A%09%2F%2F%20draw%20approximation%0A%09strokeWeight%28PIXEL_SIZE%29%3B%0A%09stroke%28%22red%22%29%3B%0A%09for%20%28i%20%3D%200%3B%20i%20%3C%20NUM_DATA_PIXEL%3B%20i%20%3D%20i%20%2B%201%29%20%7B%0A%09%09line%28DATA_WINDOW_MARGIN%20%2B%20i%20%2a%20DATA_WINDOW_SIZE_X%20%2F%20NUM_DATA_PIXEL%2C%20DATA_WINDOW_SIZE_Y%20%2B%20DATA_WINDOW_MARGIN%20-%20%28prediction%5Bi%5D%5B0%5D%20%2a%20%28outputSamplesMax%20-%20outputSamplesMin%29%20%2B%20outputSamplesMin%29%20%2a%20stretch_y%2C%20DATA_WINDOW_MARGIN%20%2B%20%28i%20%2B%201%29%20%2a%20DATA_WINDOW_SIZE_X%20%2F%20NUM_DATA_PIXEL%2C%20DATA_WINDOW_SIZE_Y%20%2B%20DATA_WINDOW_MARGIN%20-%20%28prediction%5Bi%20%2B%201%5D%5B0%5D%20%2a%20%28outputSamplesMax%20-%20outputSamplesMin%29%20%2B%20outputSamplesMin%29%20%2a%20stretch_y%29%3B%0A%09%09if%20%28prediction%5Bi%20%2B%201%5D%5B0%5D%20%2a%20%28outputSamplesMax%20-%20outputSamplesMin%29%20%2B%20outputSamplesMin%20%3C%200%20%26%26%20prediction%5Bi%5D%5B0%5D%20%2a%20%28outputSamplesMax%20-%20outputSamplesMin%29%20%2B%20outputSamplesMin%20%3E%3D%200%29%20%7B%0A%09%09%09throwingDistance%20%3D%20i%20%2a%20AXIS_RANGE_X%20%2F%20NUM_DATA_PIXEL%20%2B%201.0%20%2a%20AXIS_RANGE_X%20%2F%20NUM_DATA_PIXEL%20%2a%20%28prediction%5Bi%5D%5B0%5D%20%2a%20%28outputSamplesMax%20-%20outputSamplesMin%29%20%2B%20outputSamplesMin%29%20%2F%20%28%28prediction%5Bi%5D%5B0%5D%20-%20prediction%5Bi%20%2B%201%5D%5B0%5D%29%20%2a%20%28outputSamplesMax%20-%20outputSamplesMin%29%29%3B%0A%09%09%7D%0A%09%7D%0A%0A%09%2F%2F%20print%20training%20results%0A%09strokeWeight%281%29%3B%0A%09fill%28%22red%22%29%3B%0A%09textSize%281.25%20%2a%20TEXT_SIZE%29%3B%0A%09text%28%22Kugelstossweite%22%2C%20DATA_WINDOW_SIZE_X%20-%20DATA_WINDOW_MARGIN%20-%206%20%2a%20TEXT_SIZE%2C%20DATA_WINDOW_MARGIN%29%3B%0A%09text%28%22Berechnet%3A%20%20%20%20%20%20%22%20%2B%20THROWING_DISTANCE.toFixed%282%29.padStart%286%2C%20%22%20%22%29%2C%20DATA_WINDOW_SIZE_X%20-%20DATA_WINDOW_MARGIN%20-%206%20%2a%20TEXT_SIZE%2C%20DATA_WINDOW_MARGIN%20%2B%202%20%2a%20TEXT_SIZE%29%3B%0A%09if%20%28throwingDistance%20%3D%3D%3D%20-1%29%20%7B%0A%09%09text%28%22KI-Sch%C3%A4tzung%3A%20-%22%2C%20DATA_WINDOW_SIZE_X%20-%20DATA_WINDOW_MARGIN%20-%206%20%2a%20TEXT_SIZE%2C%20DATA_WINDOW_MARGIN%20%2B%204%20%2a%20TEXT_SIZE%29%3B%0A%09%7D%20else%20%7B%0A%09%09text%28%22KI-Sch%C3%A4tzung%3A%20%22%20%2B%20throwingDistance.toFixed%282%29.padStart%286%2C%20%22%20%22%29%2C%20DATA_WINDOW_SIZE_X%20-%20DATA_WINDOW_MARGIN%20-%206%20%2a%20TEXT_SIZE%2C%20DATA_WINDOW_MARGIN%20%2B%204%20%2a%20TEXT_SIZE%29%3B%0A%09%7D%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%20mseTrain.toFixed%285%29.padStart%289%2C%20%22%20%22%29%20%2B%20%22%20%7C%7C%22%29%3B%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20draw%20chart%20axes%20in%20graphic%20buffer%0A%2F%2F%0Afunction%20drawAxesTrainingSamplesInBuffer%28inputData%2C%20outputData%29%20%7B%0A%0A%09%2F%2F%20calculate%20scaling%20factors%0A%09let%20stretch_x%20%3D%20DATA_WINDOW_SIZE_X%20%2F%20AXIS_RANGE_X%3B%0A%09let%20stretch_y%20%3D%20DATA_WINDOW_SIZE_Y%20%2F%20AXIS_RANGE_Y%3B%0A%0A%09%2F%2F%20create%20buffer%0A%09buffer%20%3D%20createGraphics%28DATA_WINDOW_SIZE_X%20%2B%202%20%2a%20DATA_WINDOW_MARGIN%2C%20DATA_WINDOW_SIZE_Y%20%2B%202%20%2a%20DATA_WINDOW_MARGIN%29%3B%0A%09buffer.strokeWeight%28PIXEL_SIZE%29%3B%0A%09buffer.textAlign%28CENTER%2C%20CENTER%29%3B%0A%09textSize%28TEXT_SIZE%29%3B%0A%0A%09%2F%2F%20draw%20x-axis%0A%09buffer.stroke%28%22black%22%29%3B%0A%09buffer.line%28DATA_WINDOW_MARGIN%2C%20DATA_WINDOW_SIZE_Y%20%2B%20DATA_WINDOW_MARGIN%2C%20DATA_WINDOW_SIZE_X%20%2B%20DATA_WINDOW_MARGIN%2C%20DATA_WINDOW_SIZE_Y%20%2B%20DATA_WINDOW_MARGIN%29%3B%0A%09%2F%2F%20label%0A%09buffer.strokeWeight%281%29%3B%0A%09buffer.textSize%281.5%20%2a%20TEXT_SIZE%29%3B%0A%09buffer.text%28%22Weite%22%2C%20DATA_WINDOW_SIZE_X%20%2B%20DATA_WINDOW_MARGIN%2C%20DATA_WINDOW_SIZE_Y%20%2B%20DATA_WINDOW_MARGIN%20-%201.5%20%2a%20TEXT_SIZE%29%3B%0A%09%2F%2F%20ticks%20and%20numbers%0A%09buffer.textSize%28TEXT_SIZE%29%3B%0A%09buffer.strokeWeight%28PIXEL_SIZE%29%3B%0A%09for%20%28let%20i%20%3D%200%3B%20i%20%3C%3D%20AXIS_RANGE_X%3B%20i%20%3D%20i%20%2B%201%29%20%7B%0A%09%09buffer.line%28DATA_WINDOW_MARGIN%20%2B%20i%20%2a%20stretch_x%2C%20DATA_WINDOW_SIZE_Y%20%2B%20DATA_WINDOW_MARGIN%2C%20DATA_WINDOW_MARGIN%20%2B%20i%20%2a%20stretch_x%2C%20DATA_WINDOW_SIZE_Y%20%2B%20DATA_WINDOW_MARGIN%20%2B%20CROSS_SIZE%29%3B%0A%09%09buffer.strokeWeight%281%29%3B%0A%09%09buffer.text%28i%2C%20DATA_WINDOW_MARGIN%20%2B%20i%20%2a%20stretch_x%2C%20DATA_WINDOW_SIZE_Y%20%2B%20DATA_WINDOW_MARGIN%20%2B%201.5%20%2a%20TEXT_SIZE%29%3B%0A%09%09buffer.strokeWeight%28PIXEL_SIZE%29%3B%0A%09%7D%0A%0A%09%2F%2F%20draw%20y-axis%0A%09buffer.line%28DATA_WINDOW_MARGIN%2C%20DATA_WINDOW_MARGIN%2C%20DATA_WINDOW_MARGIN%2C%20DATA_WINDOW_SIZE_Y%20%2B%20DATA_WINDOW_MARGIN%29%3B%0A%09%2F%2F%20label%0A%09buffer.strokeWeight%281%29%3B%0A%09buffer.textSize%281.5%20%2a%20TEXT_SIZE%29%3B%0A%09buffer.text%28%22H%C3%B6he%22%2C%20DATA_WINDOW_MARGIN%2C%20DATA_WINDOW_MARGIN%20-%201.5%20%2a%20TEXT_SIZE%29%3B%0A%09%2F%2F%20ticks%20and%20numbers%0A%09buffer.strokeWeight%28PIXEL_SIZE%29%3B%0A%09buffer.textSize%28TEXT_SIZE%29%3B%0A%09for%20%28let%20i%20%3D%20AXIS_RANGE_Y%3B%20i%20%3E%3D%200%3B%20i%20%3D%20i%20-%201%29%20%7B%0A%09%09buffer.line%28DATA_WINDOW_MARGIN%2C%20DATA_WINDOW_MARGIN%20%2B%20i%20%2a%20stretch_y%2C%20DATA_WINDOW_MARGIN%20-%20CROSS_SIZE%2C%20DATA_WINDOW_MARGIN%20%2B%20i%20%2a%20stretch_y%29%3B%0A%09%09buffer.strokeWeight%281%29%3B%0A%09%09buffer.text%28AXIS_RANGE_Y%20-%20i%2C%20DATA_WINDOW_MARGIN%20-%201.5%20%2a%20TEXT_SIZE%2C%20DATA_WINDOW_MARGIN%20%2B%20i%20%2a%20stretch_y%29%3B%0A%09%09buffer.strokeWeight%28PIXEL_SIZE%29%3B%0A%09%7D%0A%0A%09%2F%2F%20draw%20blue%20crosse%20for%20each%20training%20sample%0A%09buffer.strokeWeight%28PIXEL_SIZE%29%3B%0A%09for%20%28let%20i%20%3D%200%3B%20i%20%3C%20inputData.length%3B%20i%2B%2B%29%20%7B%0A%09%09buffer.stroke%28%22blue%22%29%3B%0A%09%09buffer.line%28stretch_x%20%2a%20inputData%5Bi%5D%5B0%5D%20%2B%20DATA_WINDOW_MARGIN%20%2B%20CROSS_SIZE%2C%20DATA_WINDOW_SIZE_Y%20%2B%20DATA_WINDOW_MARGIN%20-%20%28stretch_y%20%2a%20outputData%5Bi%5D%5B0%5D%20%2B%20CROSS_SIZE%29%2C%20stretch_x%20%2a%20inputData%5Bi%5D%5B0%5D%20%2B%20DATA_WINDOW_MARGIN%20-%20CROSS_SIZE%2C%20DATA_WINDOW_SIZE_Y%20%2B%20DATA_WINDOW_MARGIN%20-%20%28stretch_y%20%2a%20outputData%5Bi%5D%5B0%5D%20-%20CROSS_SIZE%29%29%3B%0A%09%09buffer.line%28stretch_x%20%2a%20inputData%5Bi%5D%5B0%5D%20%2B%20DATA_WINDOW_MARGIN%20-%20CROSS_SIZE%2C%20DATA_WINDOW_SIZE_Y%20%2B%20DATA_WINDOW_MARGIN%20-%20%28stretch_y%20%2a%20outputData%5Bi%5D%5B0%5D%20%2B%20CROSS_SIZE%29%2C%20stretch_x%20%2a%20inputData%5Bi%5D%5B0%5D%20%2B%20DATA_WINDOW_MARGIN%20%2B%20CROSS_SIZE%2C%20DATA_WINDOW_SIZE_Y%20%2B%20DATA_WINDOW_MARGIN%20-%20%28stretch_y%20%2a%20outputData%5Bi%5D%5B0%5D%20-%20CROSS_SIZE%29%29%3B%0A%09%7D%0A%0A%09%2F%2F%20assign%20local%20buffer%20to%20global%20buffer%0A%09axesTrainingSamplesBuffer%20%3D%20buffer%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%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%0A%0A%20%20%20%20%2F%2F%20check%20for%20computable%20parameters%0A%09if%20%28THROWING_DISTANCE%20%3E%2040%29%20%7B%0A%09%09console.log%28%22%E2%9A%A0%EF%B8%8F%20Sorry%2C%20der%20virtuelle%20Kugelstossplatz%20ist%20nur%2040%20Meter%20lang.%22%29%3B%0A%09%09console.log%28%22Mit%20diesen%20Einstellungen%20w%C3%BCrde%20die%20Kugel%20%22%20%2B%20THROWING_DISTANCE.toFixed%282%29%20%2B%20%22%20Meter%20weit%20fliegen.%22%29%3B%0A%09%09console.log%28%22Bitte%20w%C3%A4hle%20realistischere%20Wurfparameter.%22%29%3B%0A%09%09return%3B%0A%09%7D%0A%09if%20%28THROWING_DISTANCE%20%3C%201%29%20%7B%0A%09%09console.log%28%22%E2%9A%A0%EF%B8%8F%20Sorry%2C%20W%C3%BCrfe%20von%20weniger%20als%201%20Meter%20oder%20in%20die%20falsch%20Richtung%20sind%20gef%C3%A4hrlich.%22%29%3B%0A%09%09console.log%28%22Mit%20diesen%20Einstellungen%20w%C3%BCrde%20die%20Kugel%20%22%20%2B%20THROWING_DISTANCE.toFixed%282%29%20%2B%20%22%20Meter%20weit%20fliegen.%22%29%3B%0A%09%09console.log%28%22Bitte%20w%C3%A4hle%20realistischere%20Wurfparameter.%22%29%3B%0A%09%09return%3B%0A%09%7D%0A%0A%09%2F%2F%20initiate%20console%20output%0A%09console.log%28%22%7C%7C%20Epoche%20%7C%7C%20%20%20%20MSE%20%20%20%20%7C%7C%22%29%3B%0A%0A%09%2F%2F%20create%20canvas%0A%09createCanvas%28DATA_WINDOW_SIZE_X%20%2B%202%20%2a%20DATA_WINDOW_MARGIN%2C%20DATA_WINDOW_SIZE_Y%20%2B%202%20%2a%20DATA_WINDOW_MARGIN%29%3B%0A%0A%09%2F%2F%20generate%20data%0A%09let%20%5BinputArray%2C%20outputArray%2C%20testingArray%5D%20%3D%20generateSamples%28%29%3B%0A%0A%09%2F%2F%20create%20grafic%20buffer%20for%20axes%20and%20training%20samples%0A%09drawAxesTrainingSamplesInBuffer%28inputArray%2C%20outputArray%29%3B%0A%0A%09%2F%2F%20preprocess%20data%20for%20training%0A%09let%20%5BinputTensor%2C%20outputTensor%2C%20testingTensor%5D%20%3D%20generateTensors%28inputArray%2C%20outputArray%2C%20testingArray%29%3B%0A%0A%09%2F%2F%20define%20model%0A%09compileModel%28inputTensor%2C%20outputTensor%29%3B%0A%0A%09%2F%2F%20train%20and%20visualise%20neural%20network%0A%09await%20trainModel%28inputTensor%2C%20outputTensor%2C%20testingTensor%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%7D%0A%0A%0A%2F%2F%0A%2F%2F%20p5.js%20keyPressed%28%29%20ESC%20or%20%C2%A7%20%3D%20emergency%20stop%0A%2F%2F%0Afunction%20keyPressed%28%29%20%7B%0A%09if%20%28keyCode%20%3D%3D%3D%2027%20%7C%7C%20keyCode%20%3D%3D%3D%20192%29%20%7B%20%2F%2F%20ESC%20or%20%C2%A7%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%09drawApproximation%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=500px#Kugelstossen1}} - Starte das neuronales Netz Training, indem du auf den Button ''▶Run'' klickst.\\ 💡 Es kann sein, dass die rote Linie ab und zu "springt". Das liegt daran, dass die Lernrate relativ gross eingestellt ist. Dafür läuft das Training einigermassen flott. - Wie gut schätzt das neuronale Netz die Wurfweite ab? Starte das Programm zwei oder drei Mal und notiere das beste Ergebnis. {{gem/plain?0=N4XyA#8da845d6746c1696}} - Wenn du Lust hast, kannst du noch mit den neuronalen Netz Parametern herumspielen oder andere Werte für Abwurfgeschwindigkeit, Abwurfwinkel und Abwurfhöhe ausprobieren. == ✍ Auftrag Kugelstossen 2== 💡 In diesem Beispiel werden weniger Trainingsdaten verwendet, wie wirkt sich das aus? {{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%20Parameter%20d%C3%BCrfen%20ge%C3%A4ndert%20werden.%0A%0A%2F%2F%20Neuronale%20Netz%20Parameter%0Aconst%20LERNRATE%20%3D%200.1%3B%20%2F%2F%20Dezimalzahl%20%3E%200%0Aconst%20ANZAHL_HIDDEN_NEURONS%20%3D%205%3B%20%2F%2F%20ganzzahliger%20Wert%20%3E%200%0Aconst%20ANZAHL_EPOCHEN%20%3D%201500%3B%20%2F%2F%20ganzzahliger%20Wert%20%3E%200%0A%0A%2F%2F%20Anzeigeparameter%0Aconst%20EPOCHEN_FUER_GRAFIK_UPDATE%20%3D%2050%3B%20%2F%2F%20ganzzahlig%20Wert%20%3E%200%0A%0A%2F%2F%20Wurfparameter%0Aconst%20ABWURFGESCHWINDIGKEIT%20%3D%2014.5%3B%20%2F%2F%20m%2Fs%0Aconst%20ABWURFWINKEL%20%3D%2040%3B%20%2F%2F%20%C2%B0%0Aconst%20ABWURFHOEHE%20%3D%202.3%3B%20%2F%2F%20m%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%2F%2F%20physical%20constants%0Aconst%20GRAVITY%20%3D%209.81%3B%20%2F%2F%20m%2Fs%5E2%0Aconst%20THROWING_DISTANCE%20%3D%20getThrowingDistance%28%29%3B%0A%0A%2F%2F%20options%0Aconst%20INPUT_RANGE%20%3D%20Math.floor%28THROWING_DISTANCE%29%3B%0Aconst%20INPUT_STEP%20%3D%20Math.max%280.5%2CMath.round%28THROWING_DISTANCE%2F10%29%29%2a2%3B%0Aconst%20AXIS_RANGE_X%20%3D%20Math.ceil%28THROWING_DISTANCE%29%20%2B%204%3B%0Aconst%20AXIS_RANGE_Y%20%3D%20Math.ceil%28getMaximumHeight%28%29%29%20%2B%201%3B%0Aconst%20NUM_DATA_PIXEL%20%3D%2050%3B%0Aconst%20DATA_WINDOW_SIZE_X%20%3D%20500%3B%0Aconst%20DATA_WINDOW_SIZE_Y%20%3D%20240%3B%0Aconst%20DATA_WINDOW_MARGIN%20%3D%2030%3B%0Aconst%20PIXEL_SIZE%20%3D%203%3B%0Aconst%20CROSS_SIZE%20%3D%205%3B%0Aconst%20TEXT_SIZE%20%3D%2012%3B%0A%0A%2F%2F%20global%20variables%0Alet%20model%2C%20inputSamplesMax%2C%20inputSamplesMin%2C%20outputSamplesMax%2C%20outputSamplesMin%2C%20actualEpoch%2C%20actualLogs%2C%20axesTrainingSamplesBuffer%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%20Physical%20Modelling%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%20pysical%20correct%20training%20data%0A%2F%2F%0Afunction%20generateSamples%28%29%20%7B%0A%0A%09%2F%2F%20generate%20training%20data%0A%09let%20inputSamplesArray%20%3D%20%5B%5D%3B%0A%09let%20outputSamplesArray%20%3D%20%5B%5D%3B%0A%09for%20%28let%20s%20%3D%200%3B%20s%20%3C%3D%20INPUT_RANGE%3B%20s%20%3D%20s%20%2B%20INPUT_STEP%29%20%7B%0A%09%09inputSamplesArray.push%28%5Bs%5D%29%3B%0A%09%09outputSamplesArray.push%28%5BgetHeight%28s%29%5D%29%3B%0A%09%7D%0A%0A%09%2F%2F%20calulate%20global%20normalization%20bounds%0A%09inputSamplesMax%20%3D%20Math.max.apply%28null%2C%20inputSamplesArray%29%3B%0A%09inputSamplesMin%20%3D%20Math.min.apply%28null%2C%20inputSamplesArray%29%3B%0A%09outputSamplesMax%20%3D%20Math.max.apply%28null%2C%20outputSamplesArray%29%3B%0A%09outputSamplesMin%20%3D%20Math.min.apply%28null%2C%20outputSamplesArray%29%3B%0A%0A%09%2F%2F%20generate%20testing%20data%20for%20visualization%0A%09let%20testingSamplesArray%20%3D%20%5B%5D%3B%0A%09for%20%28let%20i%20%3D%200%3B%20i%20%3C%3D%20NUM_DATA_PIXEL%3B%20i%20%3D%20i%20%2B%20AXIS_RANGE_X%20%2F%20NUM_DATA_PIXEL%29%20%7B%0A%09%09testingSamplesArray.push%28%5B%28i%20-%20inputSamplesMin%29%20%2F%20%28inputSamplesMax%20-%20inputSamplesMin%29%5D%29%3B%0A%09%7D%0A%0A%0A%09%2F%2F%20return%20input%20and%20output%20samples%0A%09return%20%5BinputSamplesArray%2C%20outputSamplesArray%2C%20testingSamplesArray%5D%3B%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20returns%20height%20given%20a%20distance%0A%2F%2F%0Afunction%20getHeight%28distance%29%20%7B%0A%0A%09return%20-GRAVITY%20%2a%20distance%20%2a%20distance%20%2F%20%282%20%2a%20ABWURFGESCHWINDIGKEIT%20%2a%20ABWURFGESCHWINDIGKEIT%20%2a%20Math.cos%28ABWURFWINKEL%20%2a%20Math.PI%20%2F%20180%29%20%2a%20Math.cos%28ABWURFWINKEL%20%2a%20Math.PI%20%2F%20180%29%29%20%2B%20Math.tan%28ABWURFWINKEL%20%2a%20Math.PI%20%2F%20180%29%20%2a%20distance%20%2B%20ABWURFHOEHE%3B%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20returns%20throwing%20distance%0A%2F%2F%0Afunction%20getThrowingDistance%28%29%20%7B%0A%0A%09return%20ABWURFGESCHWINDIGKEIT%20%2a%20ABWURFGESCHWINDIGKEIT%20%2F%20GRAVITY%20%2a%20Math.cos%28ABWURFWINKEL%20%2a%20Math.PI%20%2F%20180%29%20%2a%20%28Math.sin%28ABWURFWINKEL%20%2a%20Math.PI%20%2F%20180%29%20%2B%20Math.sqrt%28Math.sin%28ABWURFWINKEL%20%2a%20Math.PI%20%2F%20180%29%20%2a%20Math.sin%28ABWURFWINKEL%20%2a%20Math.PI%20%2F%20180%29%20%2B%202%20%2a%20GRAVITY%20%2a%20ABWURFHOEHE%20%2F%20%28ABWURFGESCHWINDIGKEIT%20%2a%20ABWURFGESCHWINDIGKEIT%29%29%29%3B%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20returns%20maximal%20height%0A%2F%2F%0Afunction%20getMaximumHeight%28%29%20%7B%0A%09return%20ABWURFGESCHWINDIGKEIT%20%2a%20ABWURFGESCHWINDIGKEIT%20%2a%20Math.sin%28ABWURFWINKEL%20%2a%20Math.PI%20%2F%20180%29%20%2a%20Math.sin%28ABWURFWINKEL%20%2a%20Math.PI%20%2F%20180%29%20%2F%20%282%20%2a%20GRAVITY%29%20%2B%20ABWURFHOEHE%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%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%28inputSamples%2C%20outputSamples%2C%20testingSamples%29%20%7B%0A%0A%09%2F%2F%20normalize%20training%20data%0A%09for%20%28let%20i%20%3D%200%3B%20i%20%3C%20inputSamples.length%3B%20i%20%3D%20i%20%2B%201%29%20%7B%0A%09%09inputSamples%5Bi%5D%5B0%5D%20%3D%20%28inputSamples%5Bi%5D%5B0%5D%20-%20inputSamplesMin%29%20%2F%20%28inputSamplesMax%20-%20inputSamplesMin%29%3B%0A%09%09outputSamples%5Bi%5D%5B0%5D%20%3D%20%28outputSamples%5Bi%5D%5B0%5D%20-%20outputSamplesMin%29%20%2F%20%28outputSamplesMax%20-%20outputSamplesMin%29%3B%0A%09%7D%0A%0A%09%2F%2F%20generate%20training%20input%20and%20output%20tensors%0A%09let%20trainingInputTensor%20%3D%20tf.tensor2d%28inputSamples%2C%20%5BinputSamples.length%2C%201%5D%29%3B%0A%09let%20trainingOutputTensor%20%3D%20tf.tensor2d%28outputSamples%2C%20%5BoutputSamples.length%2C%201%5D%29%3B%0A%09%2F%2F%20trainingOutputTensor.print%28%29%3B%20%2F%2F%20display%20tensor%20in%20the%20console%0A%0A%09%2F%2F%20generate%20testing%20input%20tensor%20for%20visualisation%0A%09let%20testingInputTensor%20%3D%20tf.tensor2d%28testingSamples%2C%20%5BtestingSamples.length%2C%201%5D%29%3B%0A%09%2F%2F%20testingInputTensor.print%28%29%3B%20%2F%2F%20display%20tensor%20in%20the%20console%0A%0A%09return%20%5BtrainingInputTensor%2C%20trainingOutputTensor%2C%20testingInputTensor%5D%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%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%5B1%5D%2C%0A%09%09%09%09units%3A%20ANZAHL_HIDDEN_NEURONS%2C%0A%09%09%09%09activation%3A%20%27sigmoid%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%27linear%27%0A%09%09%09%7D%29%0A%09%09%5D%0A%09%7D%29%3B%0A%0A%09%2F%2F%20neural%20network%20configuration%0A%09model.compile%28%7B%0A%09%09optimizer%3A%20tf.train.adam%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%28trainInput%2C%20trainOutput%2C%20testingInput%29%20%7B%0A%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%20%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%09drawApproximation%28actualEpoch%2C%20logs.loss%2C%20testingInput%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%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%2F%2F%0A%2F%2F%20decision%20boundary%20and%20network%20output%0A%2F%2F%0Afunction%20drawApproximation%28epoch%2C%20mseTrain%2C%20testingTensor%29%20%7B%0A%0A%09let%20throwingDistance%20%3D%20-1%3B%0A%0A%09%2F%2F%20calculate%20scaling%20factors%0A%09let%20stretch_x%20%3D%20DATA_WINDOW_SIZE_X%20%2F%20AXIS_RANGE_X%3B%0A%09let%20stretch_y%20%3D%20DATA_WINDOW_SIZE_Y%20%2F%20AXIS_RANGE_Y%3B%0A%0A%09%2F%2F%20calculate%20approximation%20with%20the%20current%20neural%20network%0A%09let%20prediction%20%3D%20model.predict%28testingTensor%29.arraySync%28%29%3B%0A%0A%09%2F%2F%20reset%20grafic%20and%20draw%20axes%20and%20training%20samples%0A%09background%28%22white%22%29%3B%0A%09image%28axesTrainingSamplesBuffer%2C%200%2C%200%29%3B%0A%0A%09%2F%2F%20draw%20approximation%0A%09strokeWeight%28PIXEL_SIZE%29%3B%0A%09stroke%28%22red%22%29%3B%0A%09for%20%28i%20%3D%200%3B%20i%20%3C%20NUM_DATA_PIXEL%3B%20i%20%3D%20i%20%2B%201%29%20%7B%0A%09%09line%28DATA_WINDOW_MARGIN%20%2B%20i%20%2a%20DATA_WINDOW_SIZE_X%20%2F%20NUM_DATA_PIXEL%2C%20DATA_WINDOW_SIZE_Y%20%2B%20DATA_WINDOW_MARGIN%20-%20%28prediction%5Bi%5D%5B0%5D%20%2a%20%28outputSamplesMax%20-%20outputSamplesMin%29%20%2B%20outputSamplesMin%29%20%2a%20stretch_y%2C%20DATA_WINDOW_MARGIN%20%2B%20%28i%20%2B%201%29%20%2a%20DATA_WINDOW_SIZE_X%20%2F%20NUM_DATA_PIXEL%2C%20DATA_WINDOW_SIZE_Y%20%2B%20DATA_WINDOW_MARGIN%20-%20%28prediction%5Bi%20%2B%201%5D%5B0%5D%20%2a%20%28outputSamplesMax%20-%20outputSamplesMin%29%20%2B%20outputSamplesMin%29%20%2a%20stretch_y%29%3B%0A%09%09if%20%28prediction%5Bi%20%2B%201%5D%5B0%5D%20%2a%20%28outputSamplesMax%20-%20outputSamplesMin%29%20%2B%20outputSamplesMin%20%3C%200%20%26%26%20prediction%5Bi%5D%5B0%5D%20%2a%20%28outputSamplesMax%20-%20outputSamplesMin%29%20%2B%20outputSamplesMin%20%3E%3D%200%29%20%7B%0A%09%09%09throwingDistance%20%3D%20i%20%2a%20AXIS_RANGE_X%20%2F%20NUM_DATA_PIXEL%20%2B%201.0%20%2a%20AXIS_RANGE_X%20%2F%20NUM_DATA_PIXEL%20%2a%20%28prediction%5Bi%5D%5B0%5D%20%2a%20%28outputSamplesMax%20-%20outputSamplesMin%29%20%2B%20outputSamplesMin%29%20%2F%20%28%28prediction%5Bi%5D%5B0%5D%20-%20prediction%5Bi%20%2B%201%5D%5B0%5D%29%20%2a%20%28outputSamplesMax%20-%20outputSamplesMin%29%29%3B%0A%09%09%7D%0A%09%7D%0A%0A%09%2F%2F%20print%20training%20results%0A%09strokeWeight%281%29%3B%0A%09fill%28%22red%22%29%3B%0A%09textSize%281.25%20%2a%20TEXT_SIZE%29%3B%0A%09text%28%22Kugelstossweite%22%2C%20DATA_WINDOW_SIZE_X%20-%20DATA_WINDOW_MARGIN%20-%206%20%2a%20TEXT_SIZE%2C%20DATA_WINDOW_MARGIN%29%3B%0A%09text%28%22Berechnet%3A%20%20%20%20%20%20%22%20%2B%20THROWING_DISTANCE.toFixed%282%29.padStart%286%2C%20%22%20%22%29%2C%20DATA_WINDOW_SIZE_X%20-%20DATA_WINDOW_MARGIN%20-%206%20%2a%20TEXT_SIZE%2C%20DATA_WINDOW_MARGIN%20%2B%202%20%2a%20TEXT_SIZE%29%3B%0A%09if%20%28throwingDistance%20%3D%3D%3D%20-1%29%20%7B%0A%09%09text%28%22KI-Sch%C3%A4tzung%3A%20-%22%2C%20DATA_WINDOW_SIZE_X%20-%20DATA_WINDOW_MARGIN%20-%206%20%2a%20TEXT_SIZE%2C%20DATA_WINDOW_MARGIN%20%2B%204%20%2a%20TEXT_SIZE%29%3B%0A%09%7D%20else%20%7B%0A%09%09text%28%22KI-Sch%C3%A4tzung%3A%20%22%20%2B%20throwingDistance.toFixed%282%29.padStart%286%2C%20%22%20%22%29%2C%20DATA_WINDOW_SIZE_X%20-%20DATA_WINDOW_MARGIN%20-%206%20%2a%20TEXT_SIZE%2C%20DATA_WINDOW_MARGIN%20%2B%204%20%2a%20TEXT_SIZE%29%3B%0A%09%7D%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%20mseTrain.toFixed%285%29.padStart%289%2C%20%22%20%22%29%20%2B%20%22%20%7C%7C%22%29%3B%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20draw%20chart%20axes%20in%20graphic%20buffer%0A%2F%2F%0Afunction%20drawAxesTrainingSamplesInBuffer%28inputData%2C%20outputData%29%20%7B%0A%0A%09%2F%2F%20calculate%20scaling%20factors%0A%09let%20stretch_x%20%3D%20DATA_WINDOW_SIZE_X%20%2F%20AXIS_RANGE_X%3B%0A%09let%20stretch_y%20%3D%20DATA_WINDOW_SIZE_Y%20%2F%20AXIS_RANGE_Y%3B%0A%0A%09%2F%2F%20create%20buffer%0A%09buffer%20%3D%20createGraphics%28DATA_WINDOW_SIZE_X%20%2B%202%20%2a%20DATA_WINDOW_MARGIN%2C%20DATA_WINDOW_SIZE_Y%20%2B%202%20%2a%20DATA_WINDOW_MARGIN%29%3B%0A%09buffer.strokeWeight%28PIXEL_SIZE%29%3B%0A%09buffer.textAlign%28CENTER%2C%20CENTER%29%3B%0A%09textSize%28TEXT_SIZE%29%3B%0A%0A%09%2F%2F%20draw%20x-axis%0A%09buffer.stroke%28%22black%22%29%3B%0A%09buffer.line%28DATA_WINDOW_MARGIN%2C%20DATA_WINDOW_SIZE_Y%20%2B%20DATA_WINDOW_MARGIN%2C%20DATA_WINDOW_SIZE_X%20%2B%20DATA_WINDOW_MARGIN%2C%20DATA_WINDOW_SIZE_Y%20%2B%20DATA_WINDOW_MARGIN%29%3B%0A%09%2F%2F%20label%0A%09buffer.strokeWeight%281%29%3B%0A%09buffer.textSize%281.5%20%2a%20TEXT_SIZE%29%3B%0A%09buffer.text%28%22Weite%22%2C%20DATA_WINDOW_SIZE_X%20%2B%20DATA_WINDOW_MARGIN%2C%20DATA_WINDOW_SIZE_Y%20%2B%20DATA_WINDOW_MARGIN%20-%201.5%20%2a%20TEXT_SIZE%29%3B%0A%09%2F%2F%20ticks%20and%20numbers%0A%09buffer.textSize%28TEXT_SIZE%29%3B%0A%09buffer.strokeWeight%28PIXEL_SIZE%29%3B%0A%09for%20%28let%20i%20%3D%200%3B%20i%20%3C%3D%20AXIS_RANGE_X%3B%20i%20%3D%20i%20%2B%201%29%20%7B%0A%09%09buffer.line%28DATA_WINDOW_MARGIN%20%2B%20i%20%2a%20stretch_x%2C%20DATA_WINDOW_SIZE_Y%20%2B%20DATA_WINDOW_MARGIN%2C%20DATA_WINDOW_MARGIN%20%2B%20i%20%2a%20stretch_x%2C%20DATA_WINDOW_SIZE_Y%20%2B%20DATA_WINDOW_MARGIN%20%2B%20CROSS_SIZE%29%3B%0A%09%09buffer.strokeWeight%281%29%3B%0A%09%09buffer.text%28i%2C%20DATA_WINDOW_MARGIN%20%2B%20i%20%2a%20stretch_x%2C%20DATA_WINDOW_SIZE_Y%20%2B%20DATA_WINDOW_MARGIN%20%2B%201.5%20%2a%20TEXT_SIZE%29%3B%0A%09%09buffer.strokeWeight%28PIXEL_SIZE%29%3B%0A%09%7D%0A%0A%09%2F%2F%20draw%20y-axis%0A%09buffer.line%28DATA_WINDOW_MARGIN%2C%20DATA_WINDOW_MARGIN%2C%20DATA_WINDOW_MARGIN%2C%20DATA_WINDOW_SIZE_Y%20%2B%20DATA_WINDOW_MARGIN%29%3B%0A%09%2F%2F%20label%0A%09buffer.strokeWeight%281%29%3B%0A%09buffer.textSize%281.5%20%2a%20TEXT_SIZE%29%3B%0A%09buffer.text%28%22H%C3%B6he%22%2C%20DATA_WINDOW_MARGIN%2C%20DATA_WINDOW_MARGIN%20-%201.5%20%2a%20TEXT_SIZE%29%3B%0A%09%2F%2F%20ticks%20and%20numbers%0A%09buffer.strokeWeight%28PIXEL_SIZE%29%3B%0A%09buffer.textSize%28TEXT_SIZE%29%3B%0A%09for%20%28let%20i%20%3D%20AXIS_RANGE_Y%3B%20i%20%3E%3D%200%3B%20i%20%3D%20i%20-%201%29%20%7B%0A%09%09buffer.line%28DATA_WINDOW_MARGIN%2C%20DATA_WINDOW_MARGIN%20%2B%20i%20%2a%20stretch_y%2C%20DATA_WINDOW_MARGIN%20-%20CROSS_SIZE%2C%20DATA_WINDOW_MARGIN%20%2B%20i%20%2a%20stretch_y%29%3B%0A%09%09buffer.strokeWeight%281%29%3B%0A%09%09buffer.text%28AXIS_RANGE_Y%20-%20i%2C%20DATA_WINDOW_MARGIN%20-%201.5%20%2a%20TEXT_SIZE%2C%20DATA_WINDOW_MARGIN%20%2B%20i%20%2a%20stretch_y%29%3B%0A%09%09buffer.strokeWeight%28PIXEL_SIZE%29%3B%0A%09%7D%0A%0A%09%2F%2F%20draw%20blue%20crosse%20for%20each%20training%20sample%0A%09buffer.strokeWeight%28PIXEL_SIZE%29%3B%0A%09for%20%28let%20i%20%3D%200%3B%20i%20%3C%20inputData.length%3B%20i%2B%2B%29%20%7B%0A%09%09buffer.stroke%28%22blue%22%29%3B%0A%09%09buffer.line%28stretch_x%20%2a%20inputData%5Bi%5D%5B0%5D%20%2B%20DATA_WINDOW_MARGIN%20%2B%20CROSS_SIZE%2C%20DATA_WINDOW_SIZE_Y%20%2B%20DATA_WINDOW_MARGIN%20-%20%28stretch_y%20%2a%20outputData%5Bi%5D%5B0%5D%20%2B%20CROSS_SIZE%29%2C%20stretch_x%20%2a%20inputData%5Bi%5D%5B0%5D%20%2B%20DATA_WINDOW_MARGIN%20-%20CROSS_SIZE%2C%20DATA_WINDOW_SIZE_Y%20%2B%20DATA_WINDOW_MARGIN%20-%20%28stretch_y%20%2a%20outputData%5Bi%5D%5B0%5D%20-%20CROSS_SIZE%29%29%3B%0A%09%09buffer.line%28stretch_x%20%2a%20inputData%5Bi%5D%5B0%5D%20%2B%20DATA_WINDOW_MARGIN%20-%20CROSS_SIZE%2C%20DATA_WINDOW_SIZE_Y%20%2B%20DATA_WINDOW_MARGIN%20-%20%28stretch_y%20%2a%20outputData%5Bi%5D%5B0%5D%20%2B%20CROSS_SIZE%29%2C%20stretch_x%20%2a%20inputData%5Bi%5D%5B0%5D%20%2B%20DATA_WINDOW_MARGIN%20%2B%20CROSS_SIZE%2C%20DATA_WINDOW_SIZE_Y%20%2B%20DATA_WINDOW_MARGIN%20-%20%28stretch_y%20%2a%20outputData%5Bi%5D%5B0%5D%20-%20CROSS_SIZE%29%29%3B%0A%09%7D%0A%0A%09%2F%2F%20assign%20local%20buffer%20to%20global%20buffer%0A%09axesTrainingSamplesBuffer%20%3D%20buffer%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%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%0A%0A%20%20%20%20%2F%2F%20check%20for%20computable%20parameters%0A%09if%20%28THROWING_DISTANCE%20%3E%2040%29%20%7B%0A%09%09console.log%28%22%E2%9A%A0%EF%B8%8F%20Sorry%2C%20der%20virtuelle%20Kugelstossplatz%20ist%20nur%2040%20Meter%20lang.%22%29%3B%0A%09%09console.log%28%22Mit%20diesen%20Einstellungen%20w%C3%BCrde%20die%20Kugel%20%22%20%2B%20THROWING_DISTANCE.toFixed%282%29%20%2B%20%22%20Meter%20weit%20fliegen.%22%29%3B%0A%09%09console.log%28%22Bitte%20w%C3%A4hle%20realistischere%20Wurfparameter.%22%29%3B%0A%09%09return%3B%0A%09%7D%0A%09if%20%28THROWING_DISTANCE%20%3C%201%29%20%7B%0A%09%09console.log%28%22%E2%9A%A0%EF%B8%8F%20Sorry%2C%20W%C3%BCrfe%20von%20weniger%20als%201%20Meter%20oder%20in%20die%20falsch%20Richtung%20sind%20gef%C3%A4hrlich.%22%29%3B%0A%09%09console.log%28%22Mit%20diesen%20Einstellungen%20w%C3%BCrde%20die%20Kugel%20%22%20%2B%20THROWING_DISTANCE.toFixed%282%29%20%2B%20%22%20Meter%20weit%20fliegen.%22%29%3B%0A%09%09console.log%28%22Bitte%20w%C3%A4hle%20realistischere%20Wurfparameter.%22%29%3B%0A%09%09return%3B%0A%09%7D%0A%0A%09%2F%2F%20initiate%20console%20output%0A%09console.log%28%22%7C%7C%20Epoche%20%7C%7C%20%20%20%20MSE%20%20%20%20%7C%7C%22%29%3B%0A%0A%09%2F%2F%20create%20canvas%0A%09createCanvas%28DATA_WINDOW_SIZE_X%20%2B%202%20%2a%20DATA_WINDOW_MARGIN%2C%20DATA_WINDOW_SIZE_Y%20%2B%202%20%2a%20DATA_WINDOW_MARGIN%29%3B%0A%0A%09%2F%2F%20generate%20data%0A%09let%20%5BinputArray%2C%20outputArray%2C%20testingArray%5D%20%3D%20generateSamples%28%29%3B%0A%0A%09%2F%2F%20create%20grafic%20buffer%20for%20axes%20and%20training%20samples%0A%09drawAxesTrainingSamplesInBuffer%28inputArray%2C%20outputArray%29%3B%0A%0A%09%2F%2F%20preprocess%20data%20for%20training%0A%09let%20%5BinputTensor%2C%20outputTensor%2C%20testingTensor%5D%20%3D%20generateTensors%28inputArray%2C%20outputArray%2C%20testingArray%29%3B%0A%0A%09%2F%2F%20define%20model%0A%09compileModel%28inputTensor%2C%20outputTensor%29%3B%0A%0A%09%2F%2F%20train%20and%20visualise%20neural%20network%0A%09await%20trainModel%28inputTensor%2C%20outputTensor%2C%20testingTensor%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%7D%0A%0A%0A%2F%2F%0A%2F%2F%20p5.js%20keyPressed%28%29%20ESC%20or%20%C2%A7%20%3D%20emergency%20stop%0A%2F%2F%0Afunction%20keyPressed%28%29%20%7B%0A%09if%20%28keyCode%20%3D%3D%3D%2027%20%7C%7C%20keyCode%20%3D%3D%3D%20192%29%20%7B%20%2F%2F%20ESC%20or%20%C2%A7%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%09drawApproximation%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=500px#Kugelstossen2}} - Starte das neuronales Netz Training, indem du auf den Button ''▶Run'' klickst. - Wie gut schätzt dieses Mal das neuronale Netz die Wurfweite ab? Starte das Programm zwei oder drei Mal, notiere das beste Ergebnis und vergleiche es mit dem Ergebnis aus dem Auftrag "Kugelstossen 1". {{gem/plain?0=N4XyA#65e9e45b8906b027}} - Wenn du Lust hast, kannst du auch hier mit den neuronalen Netz Parametern herumspielen oder andere Werte für Abwurfgeschwindigkeit, Abwurfwinkel und Abwurfhöhe ausprobieren. == ✍ Auftrag Kugelstossen 3== 💡 In diesem Beispiel werden unvollständige Trainingsdaten verwendet, wie wirkt sich das aus? {{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%20Parameter%20d%C3%BCrfen%20ge%C3%A4ndert%20werden.%0A%0A%2F%2F%20Neuronale%20Netz%20Parameter%0Aconst%20LERNRATE%20%3D%200.1%3B%20%2F%2F%20Dezimalzahl%20%3E%200%0Aconst%20ANZAHL_HIDDEN_NEURONS%20%3D%205%3B%20%2F%2F%20ganzzahliger%20Wert%20%3E%200%0Aconst%20ANZAHL_EPOCHEN%20%3D%201500%3B%20%2F%2F%20ganzzahliger%20Wert%20%3E%200%0A%0A%2F%2F%20Anzeigeparameter%0Aconst%20EPOCHEN_FUER_GRAFIK_UPDATE%20%3D%2050%3B%20%2F%2F%20ganzzahlig%20Wert%20%3E%200%0A%0A%2F%2F%20Wurfparameter%0Aconst%20ABWURFGESCHWINDIGKEIT%20%3D%2014.5%3B%20%2F%2F%20m%2Fs%0Aconst%20ABWURFWINKEL%20%3D%2040%3B%20%2F%2F%20%C2%B0%0Aconst%20ABWURFHOEHE%20%3D%202.3%3B%20%2F%2F%20m%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%2F%2F%20physical%20constants%0Aconst%20GRAVITY%20%3D%209.81%3B%20%2F%2F%20m%2Fs%5E2%0Aconst%20THROWING_DISTANCE%20%3D%20getThrowingDistance%28%29%3B%0A%0A%2F%2F%20options%0Aconst%20INPUT_RANGE%20%3D%20Math.floor%28THROWING_DISTANCE%29%2a3%2F4%3B%0Aconst%20INPUT_STEP%20%3D%20Math.max%280.5%2CMath.round%28THROWING_DISTANCE%2F10%29%29%3B%0Aconst%20AXIS_RANGE_X%20%3D%20Math.ceil%28THROWING_DISTANCE%29%20%2B%204%3B%0Aconst%20AXIS_RANGE_Y%20%3D%20Math.ceil%28getMaximumHeight%28%29%29%20%2B%201%3B%0Aconst%20NUM_DATA_PIXEL%20%3D%2050%3B%0Aconst%20DATA_WINDOW_SIZE_X%20%3D%20500%3B%0Aconst%20DATA_WINDOW_SIZE_Y%20%3D%20240%3B%0Aconst%20DATA_WINDOW_MARGIN%20%3D%2030%3B%0Aconst%20PIXEL_SIZE%20%3D%203%3B%0Aconst%20CROSS_SIZE%20%3D%205%3B%0Aconst%20TEXT_SIZE%20%3D%2012%3B%0A%0A%2F%2F%20global%20variables%0Alet%20model%2C%20inputSamplesMax%2C%20inputSamplesMin%2C%20outputSamplesMax%2C%20outputSamplesMin%2C%20actualEpoch%2C%20actualLogs%2C%20axesTrainingSamplesBuffer%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%20Physical%20Modelling%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%20pysical%20correct%20training%20data%0A%2F%2F%0Afunction%20generateSamples%28%29%20%7B%0A%0A%09%2F%2F%20generate%20training%20data%0A%09let%20inputSamplesArray%20%3D%20%5B%5D%3B%0A%09let%20outputSamplesArray%20%3D%20%5B%5D%3B%0A%09for%20%28let%20s%20%3D%200%3B%20s%20%3C%3D%20INPUT_RANGE%3B%20s%20%3D%20s%20%2B%20INPUT_STEP%29%20%7B%0A%09%09inputSamplesArray.push%28%5Bs%5D%29%3B%0A%09%09outputSamplesArray.push%28%5BgetHeight%28s%29%5D%29%3B%0A%09%7D%0A%0A%09%2F%2F%20calulate%20global%20normalization%20bounds%0A%09inputSamplesMax%20%3D%20Math.max.apply%28null%2C%20inputSamplesArray%29%3B%0A%09inputSamplesMin%20%3D%20Math.min.apply%28null%2C%20inputSamplesArray%29%3B%0A%09outputSamplesMax%20%3D%20Math.max.apply%28null%2C%20outputSamplesArray%29%3B%0A%09outputSamplesMin%20%3D%20Math.min.apply%28null%2C%20outputSamplesArray%29%3B%0A%0A%09%2F%2F%20generate%20testing%20data%20for%20visualization%0A%09let%20testingSamplesArray%20%3D%20%5B%5D%3B%0A%09for%20%28let%20i%20%3D%200%3B%20i%20%3C%3D%20NUM_DATA_PIXEL%3B%20i%20%3D%20i%20%2B%20AXIS_RANGE_X%20%2F%20NUM_DATA_PIXEL%29%20%7B%0A%09%09testingSamplesArray.push%28%5B%28i%20-%20inputSamplesMin%29%20%2F%20%28inputSamplesMax%20-%20inputSamplesMin%29%5D%29%3B%0A%09%7D%0A%0A%0A%09%2F%2F%20return%20input%20and%20output%20samples%0A%09return%20%5BinputSamplesArray%2C%20outputSamplesArray%2C%20testingSamplesArray%5D%3B%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20returns%20height%20given%20a%20distance%0A%2F%2F%0Afunction%20getHeight%28distance%29%20%7B%0A%0A%09return%20-GRAVITY%20%2a%20distance%20%2a%20distance%20%2F%20%282%20%2a%20ABWURFGESCHWINDIGKEIT%20%2a%20ABWURFGESCHWINDIGKEIT%20%2a%20Math.cos%28ABWURFWINKEL%20%2a%20Math.PI%20%2F%20180%29%20%2a%20Math.cos%28ABWURFWINKEL%20%2a%20Math.PI%20%2F%20180%29%29%20%2B%20Math.tan%28ABWURFWINKEL%20%2a%20Math.PI%20%2F%20180%29%20%2a%20distance%20%2B%20ABWURFHOEHE%3B%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20returns%20throwing%20distance%0A%2F%2F%0Afunction%20getThrowingDistance%28%29%20%7B%0A%0A%09return%20ABWURFGESCHWINDIGKEIT%20%2a%20ABWURFGESCHWINDIGKEIT%20%2F%20GRAVITY%20%2a%20Math.cos%28ABWURFWINKEL%20%2a%20Math.PI%20%2F%20180%29%20%2a%20%28Math.sin%28ABWURFWINKEL%20%2a%20Math.PI%20%2F%20180%29%20%2B%20Math.sqrt%28Math.sin%28ABWURFWINKEL%20%2a%20Math.PI%20%2F%20180%29%20%2a%20Math.sin%28ABWURFWINKEL%20%2a%20Math.PI%20%2F%20180%29%20%2B%202%20%2a%20GRAVITY%20%2a%20ABWURFHOEHE%20%2F%20%28ABWURFGESCHWINDIGKEIT%20%2a%20ABWURFGESCHWINDIGKEIT%29%29%29%3B%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20returns%20maximal%20height%0A%2F%2F%0Afunction%20getMaximumHeight%28%29%20%7B%0A%09return%20ABWURFGESCHWINDIGKEIT%20%2a%20ABWURFGESCHWINDIGKEIT%20%2a%20Math.sin%28ABWURFWINKEL%20%2a%20Math.PI%20%2F%20180%29%20%2a%20Math.sin%28ABWURFWINKEL%20%2a%20Math.PI%20%2F%20180%29%20%2F%20%282%20%2a%20GRAVITY%29%20%2B%20ABWURFHOEHE%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%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%28inputSamples%2C%20outputSamples%2C%20testingSamples%29%20%7B%0A%0A%09%2F%2F%20normalize%20training%20data%0A%09for%20%28let%20i%20%3D%200%3B%20i%20%3C%20inputSamples.length%3B%20i%20%3D%20i%20%2B%201%29%20%7B%0A%09%09inputSamples%5Bi%5D%5B0%5D%20%3D%20%28inputSamples%5Bi%5D%5B0%5D%20-%20inputSamplesMin%29%20%2F%20%28inputSamplesMax%20-%20inputSamplesMin%29%3B%0A%09%09outputSamples%5Bi%5D%5B0%5D%20%3D%20%28outputSamples%5Bi%5D%5B0%5D%20-%20outputSamplesMin%29%20%2F%20%28outputSamplesMax%20-%20outputSamplesMin%29%3B%0A%09%7D%0A%0A%09%2F%2F%20generate%20training%20input%20and%20output%20tensors%0A%09let%20trainingInputTensor%20%3D%20tf.tensor2d%28inputSamples%2C%20%5BinputSamples.length%2C%201%5D%29%3B%0A%09let%20trainingOutputTensor%20%3D%20tf.tensor2d%28outputSamples%2C%20%5BoutputSamples.length%2C%201%5D%29%3B%0A%09%2F%2F%20trainingOutputTensor.print%28%29%3B%20%2F%2F%20display%20tensor%20in%20the%20console%0A%0A%09%2F%2F%20generate%20testing%20input%20tensor%20for%20visualisation%0A%09let%20testingInputTensor%20%3D%20tf.tensor2d%28testingSamples%2C%20%5BtestingSamples.length%2C%201%5D%29%3B%0A%09%2F%2F%20testingInputTensor.print%28%29%3B%20%2F%2F%20display%20tensor%20in%20the%20console%0A%0A%09return%20%5BtrainingInputTensor%2C%20trainingOutputTensor%2C%20testingInputTensor%5D%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%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%5B1%5D%2C%0A%09%09%09%09units%3A%20ANZAHL_HIDDEN_NEURONS%2C%0A%09%09%09%09activation%3A%20%27sigmoid%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%27linear%27%0A%09%09%09%7D%29%0A%09%09%5D%0A%09%7D%29%3B%0A%0A%09%2F%2F%20neural%20network%20configuration%0A%09model.compile%28%7B%0A%09%09optimizer%3A%20tf.train.adam%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%28trainInput%2C%20trainOutput%2C%20testingInput%29%20%7B%0A%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%20%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%09drawApproximation%28actualEpoch%2C%20logs.loss%2C%20testingInput%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%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%2F%2F%0A%2F%2F%20decision%20boundary%20and%20network%20output%0A%2F%2F%0Afunction%20drawApproximation%28epoch%2C%20mseTrain%2C%20testingTensor%29%20%7B%0A%0A%09let%20throwingDistance%20%3D%20-1%3B%0A%0A%09%2F%2F%20calculate%20scaling%20factors%0A%09let%20stretch_x%20%3D%20DATA_WINDOW_SIZE_X%20%2F%20AXIS_RANGE_X%3B%0A%09let%20stretch_y%20%3D%20DATA_WINDOW_SIZE_Y%20%2F%20AXIS_RANGE_Y%3B%0A%0A%09%2F%2F%20calculate%20approximation%20with%20the%20current%20neural%20network%0A%09let%20prediction%20%3D%20model.predict%28testingTensor%29.arraySync%28%29%3B%0A%0A%09%2F%2F%20reset%20grafic%20and%20draw%20axes%20and%20training%20samples%0A%09background%28%22white%22%29%3B%0A%09image%28axesTrainingSamplesBuffer%2C%200%2C%200%29%3B%0A%0A%09%2F%2F%20draw%20approximation%0A%09strokeWeight%28PIXEL_SIZE%29%3B%0A%09stroke%28%22red%22%29%3B%0A%09for%20%28i%20%3D%200%3B%20i%20%3C%20NUM_DATA_PIXEL%3B%20i%20%3D%20i%20%2B%201%29%20%7B%0A%09%09line%28DATA_WINDOW_MARGIN%20%2B%20i%20%2a%20DATA_WINDOW_SIZE_X%20%2F%20NUM_DATA_PIXEL%2C%20DATA_WINDOW_SIZE_Y%20%2B%20DATA_WINDOW_MARGIN%20-%20%28prediction%5Bi%5D%5B0%5D%20%2a%20%28outputSamplesMax%20-%20outputSamplesMin%29%20%2B%20outputSamplesMin%29%20%2a%20stretch_y%2C%20DATA_WINDOW_MARGIN%20%2B%20%28i%20%2B%201%29%20%2a%20DATA_WINDOW_SIZE_X%20%2F%20NUM_DATA_PIXEL%2C%20DATA_WINDOW_SIZE_Y%20%2B%20DATA_WINDOW_MARGIN%20-%20%28prediction%5Bi%20%2B%201%5D%5B0%5D%20%2a%20%28outputSamplesMax%20-%20outputSamplesMin%29%20%2B%20outputSamplesMin%29%20%2a%20stretch_y%29%3B%0A%09%09if%20%28prediction%5Bi%20%2B%201%5D%5B0%5D%20%2a%20%28outputSamplesMax%20-%20outputSamplesMin%29%20%2B%20outputSamplesMin%20%3C%200%20%26%26%20prediction%5Bi%5D%5B0%5D%20%2a%20%28outputSamplesMax%20-%20outputSamplesMin%29%20%2B%20outputSamplesMin%20%3E%3D%200%29%20%7B%0A%09%09%09throwingDistance%20%3D%20i%20%2a%20AXIS_RANGE_X%20%2F%20NUM_DATA_PIXEL%20%2B%201.0%20%2a%20AXIS_RANGE_X%20%2F%20NUM_DATA_PIXEL%20%2a%20%28prediction%5Bi%5D%5B0%5D%20%2a%20%28outputSamplesMax%20-%20outputSamplesMin%29%20%2B%20outputSamplesMin%29%20%2F%20%28%28prediction%5Bi%5D%5B0%5D%20-%20prediction%5Bi%20%2B%201%5D%5B0%5D%29%20%2a%20%28outputSamplesMax%20-%20outputSamplesMin%29%29%3B%0A%09%09%7D%0A%09%7D%0A%0A%09%2F%2F%20print%20training%20results%0A%09strokeWeight%281%29%3B%0A%09fill%28%22red%22%29%3B%0A%09textSize%281.25%20%2a%20TEXT_SIZE%29%3B%0A%09text%28%22Kugelstossweite%22%2C%20DATA_WINDOW_SIZE_X%20-%20DATA_WINDOW_MARGIN%20-%206%20%2a%20TEXT_SIZE%2C%20DATA_WINDOW_MARGIN%29%3B%0A%09text%28%22Berechnet%3A%20%20%20%20%20%20%22%20%2B%20THROWING_DISTANCE.toFixed%282%29.padStart%286%2C%20%22%20%22%29%2C%20DATA_WINDOW_SIZE_X%20-%20DATA_WINDOW_MARGIN%20-%206%20%2a%20TEXT_SIZE%2C%20DATA_WINDOW_MARGIN%20%2B%202%20%2a%20TEXT_SIZE%29%3B%0A%09if%20%28throwingDistance%20%3D%3D%3D%20-1%29%20%7B%0A%09%09text%28%22KI-Sch%C3%A4tzung%3A%20-%22%2C%20DATA_WINDOW_SIZE_X%20-%20DATA_WINDOW_MARGIN%20-%206%20%2a%20TEXT_SIZE%2C%20DATA_WINDOW_MARGIN%20%2B%204%20%2a%20TEXT_SIZE%29%3B%0A%09%7D%20else%20%7B%0A%09%09text%28%22KI-Sch%C3%A4tzung%3A%20%22%20%2B%20throwingDistance.toFixed%282%29.padStart%286%2C%20%22%20%22%29%2C%20DATA_WINDOW_SIZE_X%20-%20DATA_WINDOW_MARGIN%20-%206%20%2a%20TEXT_SIZE%2C%20DATA_WINDOW_MARGIN%20%2B%204%20%2a%20TEXT_SIZE%29%3B%0A%09%7D%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%20mseTrain.toFixed%285%29.padStart%289%2C%20%22%20%22%29%20%2B%20%22%20%7C%7C%22%29%3B%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20draw%20chart%20axes%20in%20graphic%20buffer%0A%2F%2F%0Afunction%20drawAxesTrainingSamplesInBuffer%28inputData%2C%20outputData%29%20%7B%0A%0A%09%2F%2F%20calculate%20scaling%20factors%0A%09let%20stretch_x%20%3D%20DATA_WINDOW_SIZE_X%20%2F%20AXIS_RANGE_X%3B%0A%09let%20stretch_y%20%3D%20DATA_WINDOW_SIZE_Y%20%2F%20AXIS_RANGE_Y%3B%0A%0A%09%2F%2F%20create%20buffer%0A%09buffer%20%3D%20createGraphics%28DATA_WINDOW_SIZE_X%20%2B%202%20%2a%20DATA_WINDOW_MARGIN%2C%20DATA_WINDOW_SIZE_Y%20%2B%202%20%2a%20DATA_WINDOW_MARGIN%29%3B%0A%09buffer.strokeWeight%28PIXEL_SIZE%29%3B%0A%09buffer.textAlign%28CENTER%2C%20CENTER%29%3B%0A%09textSize%28TEXT_SIZE%29%3B%0A%0A%09%2F%2F%20draw%20x-axis%0A%09buffer.stroke%28%22black%22%29%3B%0A%09buffer.line%28DATA_WINDOW_MARGIN%2C%20DATA_WINDOW_SIZE_Y%20%2B%20DATA_WINDOW_MARGIN%2C%20DATA_WINDOW_SIZE_X%20%2B%20DATA_WINDOW_MARGIN%2C%20DATA_WINDOW_SIZE_Y%20%2B%20DATA_WINDOW_MARGIN%29%3B%0A%09%2F%2F%20label%0A%09buffer.strokeWeight%281%29%3B%0A%09buffer.textSize%281.5%20%2a%20TEXT_SIZE%29%3B%0A%09buffer.text%28%22Weite%22%2C%20DATA_WINDOW_SIZE_X%20%2B%20DATA_WINDOW_MARGIN%2C%20DATA_WINDOW_SIZE_Y%20%2B%20DATA_WINDOW_MARGIN%20-%201.5%20%2a%20TEXT_SIZE%29%3B%0A%09%2F%2F%20ticks%20and%20numbers%0A%09buffer.textSize%28TEXT_SIZE%29%3B%0A%09buffer.strokeWeight%28PIXEL_SIZE%29%3B%0A%09for%20%28let%20i%20%3D%200%3B%20i%20%3C%3D%20AXIS_RANGE_X%3B%20i%20%3D%20i%20%2B%201%29%20%7B%0A%09%09buffer.line%28DATA_WINDOW_MARGIN%20%2B%20i%20%2a%20stretch_x%2C%20DATA_WINDOW_SIZE_Y%20%2B%20DATA_WINDOW_MARGIN%2C%20DATA_WINDOW_MARGIN%20%2B%20i%20%2a%20stretch_x%2C%20DATA_WINDOW_SIZE_Y%20%2B%20DATA_WINDOW_MARGIN%20%2B%20CROSS_SIZE%29%3B%0A%09%09buffer.strokeWeight%281%29%3B%0A%09%09buffer.text%28i%2C%20DATA_WINDOW_MARGIN%20%2B%20i%20%2a%20stretch_x%2C%20DATA_WINDOW_SIZE_Y%20%2B%20DATA_WINDOW_MARGIN%20%2B%201.5%20%2a%20TEXT_SIZE%29%3B%0A%09%09buffer.strokeWeight%28PIXEL_SIZE%29%3B%0A%09%7D%0A%0A%09%2F%2F%20draw%20y-axis%0A%09buffer.line%28DATA_WINDOW_MARGIN%2C%20DATA_WINDOW_MARGIN%2C%20DATA_WINDOW_MARGIN%2C%20DATA_WINDOW_SIZE_Y%20%2B%20DATA_WINDOW_MARGIN%29%3B%0A%09%2F%2F%20label%0A%09buffer.strokeWeight%281%29%3B%0A%09buffer.textSize%281.5%20%2a%20TEXT_SIZE%29%3B%0A%09buffer.text%28%22H%C3%B6he%22%2C%20DATA_WINDOW_MARGIN%2C%20DATA_WINDOW_MARGIN%20-%201.5%20%2a%20TEXT_SIZE%29%3B%0A%09%2F%2F%20ticks%20and%20numbers%0A%09buffer.strokeWeight%28PIXEL_SIZE%29%3B%0A%09buffer.textSize%28TEXT_SIZE%29%3B%0A%09for%20%28let%20i%20%3D%20AXIS_RANGE_Y%3B%20i%20%3E%3D%200%3B%20i%20%3D%20i%20-%201%29%20%7B%0A%09%09buffer.line%28DATA_WINDOW_MARGIN%2C%20DATA_WINDOW_MARGIN%20%2B%20i%20%2a%20stretch_y%2C%20DATA_WINDOW_MARGIN%20-%20CROSS_SIZE%2C%20DATA_WINDOW_MARGIN%20%2B%20i%20%2a%20stretch_y%29%3B%0A%09%09buffer.strokeWeight%281%29%3B%0A%09%09buffer.text%28AXIS_RANGE_Y%20-%20i%2C%20DATA_WINDOW_MARGIN%20-%201.5%20%2a%20TEXT_SIZE%2C%20DATA_WINDOW_MARGIN%20%2B%20i%20%2a%20stretch_y%29%3B%0A%09%09buffer.strokeWeight%28PIXEL_SIZE%29%3B%0A%09%7D%0A%0A%09%2F%2F%20draw%20blue%20crosse%20for%20each%20training%20sample%0A%09buffer.strokeWeight%28PIXEL_SIZE%29%3B%0A%09for%20%28let%20i%20%3D%200%3B%20i%20%3C%20inputData.length%3B%20i%2B%2B%29%20%7B%0A%09%09buffer.stroke%28%22blue%22%29%3B%0A%09%09buffer.line%28stretch_x%20%2a%20inputData%5Bi%5D%5B0%5D%20%2B%20DATA_WINDOW_MARGIN%20%2B%20CROSS_SIZE%2C%20DATA_WINDOW_SIZE_Y%20%2B%20DATA_WINDOW_MARGIN%20-%20%28stretch_y%20%2a%20outputData%5Bi%5D%5B0%5D%20%2B%20CROSS_SIZE%29%2C%20stretch_x%20%2a%20inputData%5Bi%5D%5B0%5D%20%2B%20DATA_WINDOW_MARGIN%20-%20CROSS_SIZE%2C%20DATA_WINDOW_SIZE_Y%20%2B%20DATA_WINDOW_MARGIN%20-%20%28stretch_y%20%2a%20outputData%5Bi%5D%5B0%5D%20-%20CROSS_SIZE%29%29%3B%0A%09%09buffer.line%28stretch_x%20%2a%20inputData%5Bi%5D%5B0%5D%20%2B%20DATA_WINDOW_MARGIN%20-%20CROSS_SIZE%2C%20DATA_WINDOW_SIZE_Y%20%2B%20DATA_WINDOW_MARGIN%20-%20%28stretch_y%20%2a%20outputData%5Bi%5D%5B0%5D%20%2B%20CROSS_SIZE%29%2C%20stretch_x%20%2a%20inputData%5Bi%5D%5B0%5D%20%2B%20DATA_WINDOW_MARGIN%20%2B%20CROSS_SIZE%2C%20DATA_WINDOW_SIZE_Y%20%2B%20DATA_WINDOW_MARGIN%20-%20%28stretch_y%20%2a%20outputData%5Bi%5D%5B0%5D%20-%20CROSS_SIZE%29%29%3B%0A%09%7D%0A%0A%09%2F%2F%20assign%20local%20buffer%20to%20global%20buffer%0A%09axesTrainingSamplesBuffer%20%3D%20buffer%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%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%0A%0A%20%20%20%20%2F%2F%20check%20for%20computable%20parameters%0A%09if%20%28THROWING_DISTANCE%20%3E%2040%29%20%7B%0A%09%09console.log%28%22%E2%9A%A0%EF%B8%8F%20Sorry%2C%20der%20virtuelle%20Kugelstossplatz%20ist%20nur%2040%20Meter%20lang.%22%29%3B%0A%09%09console.log%28%22Mit%20diesen%20Einstellungen%20w%C3%BCrde%20die%20Kugel%20%22%20%2B%20THROWING_DISTANCE.toFixed%282%29%20%2B%20%22%20Meter%20weit%20fliegen.%22%29%3B%0A%09%09console.log%28%22Bitte%20w%C3%A4hle%20realistischere%20Wurfparameter.%22%29%3B%0A%09%09return%3B%0A%09%7D%0A%09if%20%28THROWING_DISTANCE%20%3C%201%29%20%7B%0A%09%09console.log%28%22%E2%9A%A0%EF%B8%8F%20Sorry%2C%20W%C3%BCrfe%20von%20weniger%20als%201%20Meter%20oder%20in%20die%20falsch%20Richtung%20sind%20gef%C3%A4hrlich.%22%29%3B%0A%09%09console.log%28%22Mit%20diesen%20Einstellungen%20w%C3%BCrde%20die%20Kugel%20%22%20%2B%20THROWING_DISTANCE.toFixed%282%29%20%2B%20%22%20Meter%20weit%20fliegen.%22%29%3B%0A%09%09console.log%28%22Bitte%20w%C3%A4hle%20realistischere%20Wurfparameter.%22%29%3B%0A%09%09return%3B%0A%09%7D%0A%0A%09%2F%2F%20initiate%20console%20output%0A%09console.log%28%22%7C%7C%20Epoche%20%7C%7C%20%20%20%20MSE%20%20%20%20%7C%7C%22%29%3B%0A%0A%09%2F%2F%20create%20canvas%0A%09createCanvas%28DATA_WINDOW_SIZE_X%20%2B%202%20%2a%20DATA_WINDOW_MARGIN%2C%20DATA_WINDOW_SIZE_Y%20%2B%202%20%2a%20DATA_WINDOW_MARGIN%29%3B%0A%0A%09%2F%2F%20generate%20data%0A%09let%20%5BinputArray%2C%20outputArray%2C%20testingArray%5D%20%3D%20generateSamples%28%29%3B%0A%0A%09%2F%2F%20create%20grafic%20buffer%20for%20axes%20and%20training%20samples%0A%09drawAxesTrainingSamplesInBuffer%28inputArray%2C%20outputArray%29%3B%0A%0A%09%2F%2F%20preprocess%20data%20for%20training%0A%09let%20%5BinputTensor%2C%20outputTensor%2C%20testingTensor%5D%20%3D%20generateTensors%28inputArray%2C%20outputArray%2C%20testingArray%29%3B%0A%0A%09%2F%2F%20define%20model%0A%09compileModel%28inputTensor%2C%20outputTensor%29%3B%0A%0A%09%2F%2F%20train%20and%20visualise%20neural%20network%0A%09await%20trainModel%28inputTensor%2C%20outputTensor%2C%20testingTensor%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%7D%0A%0A%0A%2F%2F%0A%2F%2F%20p5.js%20keyPressed%28%29%20ESC%20or%20%C2%A7%20%3D%20emergency%20stop%0A%2F%2F%0Afunction%20keyPressed%28%29%20%7B%0A%09if%20%28keyCode%20%3D%3D%3D%2027%20%7C%7C%20keyCode%20%3D%3D%3D%20192%29%20%7B%20%2F%2F%20ESC%20or%20%C2%A7%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%09drawApproximation%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=500px#Kugelstossen3}} - Starte das neuronales Netz Training, indem du auf den Button ''▶Run'' klickst. - Wie gut schätzt hier das neuronale Netz die Wurfweite ab? Was macht das neuronale Netz im Bereich wo keine Trainingsdaten da sind? Was bedeutet das für andere neuronale Netze, wie z.B. einen KI-Chatbot (z.B. ChatGPT)? Halte deine Überlegungen im Textfeld fest. {{gem/plain?0=N4XyA#c3e16c0eab92579f}} - Vergleiche deine Überlegungen mit ++unseren Überlegungen|\\ \\ Wo das neuronale Netz keine Daten hat macht es irgendetwas. Wird z.B. in ChatGPT eine Frage eingegeben, welche selten oder nicht in den Trainingstexten vorkommt, so wird irgendetwas ausgegeben.\\ \\ ++. ===== - Funktionen erraten ===== 💡 Ein Zusammenhang kann mathematisch durch eine Funktion beschrieben werden. Wenn $x$ zum Resultat $y$ führt, dann wird das als $y = f(x)$ geschreiben, wobei $x$ eine Eingabe / Aktion / Beobachtung / etc. sein kann und die Funktion $f$ den gesuchten Zusammenhang beschreibt. Wenn wir mit einem neuronalen Netz eine Kurve durch Punkte legen, dann erlernt das neuronale Netz eine Funktion, welche durch alle Punkte geht. In der Fachsprache wird dies als "Funktionsapproximation" bezeichnet. == ✍ Auftrag Lustige Funktion == {{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%200.1%3B%20%2F%2F%20Dezimalzahl%20%3E%200%0Aconst%20ANZAHL_HIDDEN_NEURONS%20%3D%205%3B%20%2F%2F%20ganzzahliger%20Wert%20%3E%200%0Aconst%20ANZAHL_EPOCHEN%20%3D%205000%3B%20%2F%2F%20ganzzahliger%20Wert%20%3E%200%0Aconst%20EPOCHEN_FUER_GRAFIK_UPDATE%20%3D%2050%3B%20%2F%2F%20ganzzahlig%20Wert%20%3E%200%0A%0A%2F%2F%20Trainingsdatenpunkte%0A%2F%2F%20Die%20erste%20x-Koordinate%20geh%C3%B6rt%20zur%20ersten%20y-Koordinate%20etc.%0Aconst%20xKoordinatenDerTrainingsdaten%20%3D%20%5B%0A%09%5B1.0%5D%2C%0A%09%5B2.0%5D%2C%0A%09%5B3.0%5D%2C%0A%09%5B4.0%5D%2C%0A%09%5B5.0%5D%2C%0A%09%5B6.0%5D%2C%0A%09%5B7.0%5D%2C%0A%09%5B8.0%5D%2C%0A%09%5B9.0%5D%2C%0A%09%5B10.0%5D%2C%0A%09%5B11.0%5D%0A%5D%3B%0Aconst%20yKoordinatenDerTrainingsdaten%20%3D%20%5B%0A%09%5B8.0%5D%2C%0A%09%5B5.0%5D%2C%0A%09%5B2.0%5D%2C%0A%09%5B5.0%5D%2C%0A%09%5B8.0%5D%2C%0A%09%5B5.0%5D%2C%0A%09%5B2.0%5D%2C%0A%09%5B5.0%5D%2C%0A%09%5B8.0%5D%2C%0A%09%5B5.0%5D%2C%0A%09%5B2.0%5D%0A%5D%3B%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%20options%0Aconst%20NUM_DATA_PIXEL%20%3D%2050%3B%0Aconst%20DATA_WINDOW_SIZE_X%20%3D%20340%3B%0Aconst%20DATA_WINDOW_SIZE_Y%20%3D%20240%3B%0Aconst%20DATA_WINDOW_MARGIN%20%3D%2030%3B%0Aconst%20PIXEL_SIZE%20%3D%203%3B%0Aconst%20CROSS_SIZE%20%3D%205%3B%0Aconst%20TEXT_SIZE%20%3D%2012%3B%0A%0A%2F%2F%20axis%20bounds%0Aconst%20AXIS_RANGE_X%20%3D%20%20Math.max.apply%28null%2C%20xKoordinatenDerTrainingsdaten%29%20%2B%202%3B%0Aconst%20AXIS_RANGE_Y%20%3D%20Math.max.apply%28null%2C%20yKoordinatenDerTrainingsdaten%29%20%2B%202%3B%0A%0A%2F%2F%20normalization%20bounds%0Aconst%20trainInputMax%20%3D%20Math.max.apply%28null%2C%20xKoordinatenDerTrainingsdaten%29%3B%0Aconst%20trainInputMin%20%3D%20Math.min.apply%28null%2C%20xKoordinatenDerTrainingsdaten%29%3B%0Aconst%20trainOutputMax%20%3D%20Math.max.apply%28null%2C%20yKoordinatenDerTrainingsdaten%29%3B%0Aconst%20trainOutputMin%20%3D%20Math.min.apply%28null%2C%20yKoordinatenDerTrainingsdaten%29%3B%0A%0A%2F%2F%20global%20variables%0Alet%20model%2C%20trainInput%2C%20trainOutput%2C%20testInput%2C%20actualEpoch%2C%20actualLogs%2C%20axesTrainingSamples%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%0A%09%2F%2F%20normalize%20training%20data%0A%09for%20%28let%20i%20%3D%200%3B%20i%20%3C%20xKoordinatenDerTrainingsdaten.length%3B%20i%20%3D%20i%20%2B%201%29%20%7B%0A%09%09xKoordinatenDerTrainingsdaten%5Bi%5D%5B0%5D%20%3D%20%28xKoordinatenDerTrainingsdaten%5Bi%5D%5B0%5D%20-%20trainInputMin%29%20%2F%20%28trainInputMax%20-%20trainInputMin%29%3B%0A%09%09yKoordinatenDerTrainingsdaten%5Bi%5D%5B0%5D%20%3D%20%28yKoordinatenDerTrainingsdaten%5Bi%5D%5B0%5D%20-%20trainOutputMin%29%20%2F%20%28trainOutputMax%20-%20trainOutputMin%29%3B%0A%09%7D%0A%0A%09%2F%2F%20generate%20training%20input%20and%20output%20tensors%0A%09trainInput%20%3D%20tf.tensor2d%28xKoordinatenDerTrainingsdaten%2C%20%5BxKoordinatenDerTrainingsdaten.length%2C%201%5D%29%3B%0A%09trainOutput%20%3D%20tf.tensor2d%28yKoordinatenDerTrainingsdaten%2C%20%5ByKoordinatenDerTrainingsdaten.length%2C%201%5D%29%3B%0A%09%2F%2F%20trainOutput.print%28%29%3B%20%2F%2F%20display%20tensor%20in%20the%20console%0A%0A%09%2F%2F%20generate%20testing%20data%20for%20visualization%0A%09let%20testInputArray%20%3D%20%5B%5D%3B%0A%09for%20%28let%20i%20%3D%200%3B%20i%20%3C%3D%20NUM_DATA_PIXEL%3B%20i%20%3D%20i%20%2B%20AXIS_RANGE_X%20%2F%20NUM_DATA_PIXEL%29%20%7B%0A%09%09testInputArray.push%28%5B%28i%20-%20trainInputMin%29%20%2F%20%28trainInputMax%20-%20trainInputMin%29%5D%29%3B%0A%09%7D%0A%0A%09%2F%2F%20generate%20testing%20input%20tensor%20for%20visualisation%0A%09testInput%20%3D%20tf.tensor2d%28testInputArray%2C%20%5BtestInputArray.length%2C%201%5D%29%3B%0A%09%2F%2F%20testInput.print%28%29%3B%20%2F%2F%20display%20tensor%20in%20the%20console%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%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%5B1%5D%2C%0A%09%09%09%09units%3A%20ANZAHL_HIDDEN_NEURONS%2C%0A%09%09%09%09activation%3A%20%27sigmoid%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%27linear%27%0A%09%09%09%7D%29%0A%09%09%5D%0A%09%7D%29%3B%0A%0A%09%2F%2F%20neural%20network%20configuration%0A%09model.compile%28%7B%0A%09%09optimizer%3A%20tf.train.adam%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%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%20%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%09drawApproximation%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%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%2F%2F%0A%2F%2F%20decision%20boundary%20and%20network%20output%0A%2F%2F%0Afunction%20drawApproximation%28epoch%2C%20mseTrain%29%20%7B%0A%0A%09%2F%2F%20calculate%20scaling%20factors%0A%09let%20stretch_x%20%3D%20DATA_WINDOW_SIZE_X%20%2F%20AXIS_RANGE_X%3B%0A%09let%20stretch_y%20%3D%20DATA_WINDOW_SIZE_Y%20%2F%20AXIS_RANGE_Y%3B%0A%0A%09%2F%2F%20calculate%20approximation%20with%20the%20current%20neural%20network%0A%09let%20prediction%20%3D%20model.predict%28testInput%29.arraySync%28%29%3B%0A%0A%09%2F%2F%20reset%20grafic%20and%20draw%20axes%20and%20training%20samples%0A%09background%28%22white%22%29%3B%0A%09image%28axesTrainingSamplesBuffer%2C%200%2C%200%29%3B%0A%0A%09%2F%2F%20draw%20approximation%0A%09strokeWeight%28PIXEL_SIZE%29%3B%0A%09stroke%28%22red%22%29%3B%0A%09for%20%28i%20%3D%200%3B%20i%20%3C%20NUM_DATA_PIXEL%3B%20i%20%3D%20i%20%2B%201%29%20%7B%0A%09%09line%28DATA_WINDOW_MARGIN%20%2B%20i%20%2a%20DATA_WINDOW_SIZE_X%20%2F%20NUM_DATA_PIXEL%2C%20DATA_WINDOW_SIZE_Y%20%2B%20DATA_WINDOW_MARGIN%20-%20%28prediction%5Bi%5D%5B0%5D%20%2a%20%28trainOutputMax%20-%20trainOutputMin%29%20%2B%20trainOutputMin%29%20%2a%20stretch_y%2C%20DATA_WINDOW_MARGIN%20%2B%20%28i%20%2B%201%29%20%2a%20DATA_WINDOW_SIZE_X%20%2F%20NUM_DATA_PIXEL%2C%20DATA_WINDOW_SIZE_Y%20%2B%20DATA_WINDOW_MARGIN%20-%20%28prediction%5Bi%20%2B%201%5D%5B0%5D%20%2a%20%28trainOutputMax%20-%20trainOutputMin%29%20%2B%20trainOutputMin%29%20%2a%20stretch_y%29%3B%0A%09%7D%0A%0A%09%2F%2F%20print%20training%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%20mseTrain.toFixed%285%29.padStart%289%2C%20%22%20%22%29%20%2B%20%22%20%7C%7C%22%29%3B%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20draw%20chart%20axes%20in%20graphic%20buffer%0A%2F%2F%0Afunction%20drawAxesTrainingSamplesInBuffer%28inputData%2C%20outputData%2C%20buffer%29%20%7B%0A%0A%09%2F%2F%20calculate%20scaling%20factors%0A%09let%20stretch_x%20%3D%20DATA_WINDOW_SIZE_X%20%2F%20AXIS_RANGE_X%3B%0A%09let%20stretch_y%20%3D%20DATA_WINDOW_SIZE_Y%20%2F%20AXIS_RANGE_Y%3B%0A%09buffer.strokeWeight%28PIXEL_SIZE%29%3B%0A%09buffer.textAlign%28CENTER%2C%20CENTER%29%3B%0A%09textSize%28TEXT_SIZE%29%3B%0A%0A%09%2F%2F%20draw%20x-axis%0A%09buffer.stroke%28%22black%22%29%3B%0A%09buffer.line%28DATA_WINDOW_MARGIN%2C%20DATA_WINDOW_SIZE_Y%20%2B%20DATA_WINDOW_MARGIN%2C%20DATA_WINDOW_SIZE_X%20%2B%20DATA_WINDOW_MARGIN%2C%20DATA_WINDOW_SIZE_Y%20%2B%20DATA_WINDOW_MARGIN%29%3B%0A%09%2F%2F%20label%0A%09buffer.strokeWeight%281%29%3B%0A%09buffer.textSize%281.5%20%2a%20TEXT_SIZE%29%3B%0A%09buffer.text%28%22x%22%2C%20DATA_WINDOW_SIZE_X%20%2B%20DATA_WINDOW_MARGIN%20%2B%201.5%20%2a%20TEXT_SIZE%2C%20DATA_WINDOW_SIZE_Y%20%2B%20DATA_WINDOW_MARGIN%29%3B%0A%09%2F%2F%20ticks%20and%20numbers%0A%09buffer.textSize%28TEXT_SIZE%29%3B%0A%09buffer.strokeWeight%28PIXEL_SIZE%29%3B%0A%09for%20%28let%20i%20%3D%200%3B%20i%20%3C%3D%20AXIS_RANGE_X%3B%20i%20%3D%20i%20%2B%201%29%20%7B%0A%09%09buffer.line%28DATA_WINDOW_MARGIN%20%2B%20i%20%2a%20stretch_x%2C%20DATA_WINDOW_SIZE_Y%20%2B%20DATA_WINDOW_MARGIN%2C%20DATA_WINDOW_MARGIN%20%2B%20i%20%2a%20stretch_x%2C%20DATA_WINDOW_SIZE_Y%20%2B%20DATA_WINDOW_MARGIN%20%2B%20CROSS_SIZE%29%3B%0A%09%09buffer.strokeWeight%281%29%3B%0A%09%09buffer.text%28i%2C%20DATA_WINDOW_MARGIN%20%2B%20i%20%2a%20stretch_x%2C%20DATA_WINDOW_SIZE_Y%20%2B%20DATA_WINDOW_MARGIN%20%2B%201.5%20%2a%20TEXT_SIZE%29%3B%0A%09%09buffer.strokeWeight%28PIXEL_SIZE%29%3B%0A%09%7D%0A%0A%09%2F%2F%20draw%20y-axis%0A%09buffer.line%28DATA_WINDOW_MARGIN%2C%20DATA_WINDOW_MARGIN%2C%20DATA_WINDOW_MARGIN%2C%20DATA_WINDOW_SIZE_Y%20%2B%20DATA_WINDOW_MARGIN%29%3B%0A%09%2F%2F%20label%0A%09buffer.strokeWeight%281%29%3B%0A%09buffer.textSize%281.5%20%2a%20TEXT_SIZE%29%3B%0A%09buffer.text%28%22y%22%2C%20DATA_WINDOW_MARGIN%2C%20DATA_WINDOW_MARGIN%20-%201.5%20%2a%20TEXT_SIZE%29%3B%0A%09%2F%2F%20ticks%20and%20numbers%0A%09buffer.strokeWeight%28PIXEL_SIZE%29%3B%0A%09buffer.textSize%28TEXT_SIZE%29%3B%0A%09for%20%28let%20i%20%3D%20AXIS_RANGE_Y%3B%20i%20%3E%3D%200%3B%20i%20%3D%20i%20-%201%29%20%7B%0A%09%09buffer.line%28DATA_WINDOW_MARGIN%2C%20DATA_WINDOW_MARGIN%20%2B%20i%20%2a%20stretch_y%2C%20DATA_WINDOW_MARGIN%20-%20CROSS_SIZE%2C%20DATA_WINDOW_MARGIN%20%2B%20i%20%2a%20stretch_y%29%3B%0A%09%09buffer.strokeWeight%281%29%3B%0A%09%09buffer.text%28AXIS_RANGE_Y%20-%20i%2C%20DATA_WINDOW_MARGIN%20-%201.5%20%2a%20TEXT_SIZE%2C%20DATA_WINDOW_MARGIN%20%2B%20i%20%2a%20stretch_y%29%3B%0A%09%09buffer.strokeWeight%28PIXEL_SIZE%29%3B%0A%09%7D%0A%0A%09%2F%2F%20draw%20blue%20crosse%20for%20each%20training%20sample%0A%09buffer.strokeWeight%28PIXEL_SIZE%29%3B%0A%09for%20%28let%20i%20%3D%200%3B%20i%20%3C%20inputData.length%3B%20i%2B%2B%29%20%7B%0A%09%09buffer.stroke%28%22blue%22%29%3B%0A%09%09buffer.line%28stretch_x%20%2a%20inputData%5Bi%5D%5B0%5D%20%2B%20DATA_WINDOW_MARGIN%20%2B%20CROSS_SIZE%2C%20DATA_WINDOW_SIZE_Y%20%2B%20DATA_WINDOW_MARGIN%20-%20%28stretch_y%20%2a%20outputData%5Bi%5D%5B0%5D%20%2B%20CROSS_SIZE%29%2C%20stretch_x%20%2a%20inputData%5Bi%5D%5B0%5D%20%2B%20DATA_WINDOW_MARGIN%20-%20CROSS_SIZE%2C%20DATA_WINDOW_SIZE_Y%20%2B%20DATA_WINDOW_MARGIN%20-%20%28stretch_y%20%2a%20outputData%5Bi%5D%5B0%5D%20-%20CROSS_SIZE%29%29%3B%0A%09%09buffer.line%28stretch_x%20%2a%20inputData%5Bi%5D%5B0%5D%20%2B%20DATA_WINDOW_MARGIN%20-%20CROSS_SIZE%2C%20DATA_WINDOW_SIZE_Y%20%2B%20DATA_WINDOW_MARGIN%20-%20%28stretch_y%20%2a%20outputData%5Bi%5D%5B0%5D%20%2B%20CROSS_SIZE%29%2C%20stretch_x%20%2a%20inputData%5Bi%5D%5B0%5D%20%2B%20DATA_WINDOW_MARGIN%20%2B%20CROSS_SIZE%2C%20DATA_WINDOW_SIZE_Y%20%2B%20DATA_WINDOW_MARGIN%20-%20%28stretch_y%20%2a%20outputData%5Bi%5D%5B0%5D%20-%20CROSS_SIZE%29%29%3B%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%0A%0A%09%2F%2F%20initiate%20console%20output%0A%09console.log%28%22%7C%7C%20Epoche%20%7C%7C%20%20%20%20MSE%20%20%20%20%7C%7C%22%29%3B%0A%0A%09%2F%2F%20create%20canvas%0A%09createCanvas%28DATA_WINDOW_SIZE_X%20%2B%202%20%2a%20DATA_WINDOW_MARGIN%2C%20DATA_WINDOW_SIZE_Y%20%2B%202%20%2a%20DATA_WINDOW_MARGIN%29%3B%0A%0A%09%2F%2F%20create%20grafic%20buffer%20for%20axes%20and%20training%20samples%0A%09axesTrainingSamplesBuffer%20%3D%20createGraphics%28DATA_WINDOW_SIZE_X%20%2B%202%20%2a%20DATA_WINDOW_MARGIN%2C%20DATA_WINDOW_SIZE_Y%20%2B%202%20%2a%20DATA_WINDOW_MARGIN%29%3B%0A%09drawAxesTrainingSamplesInBuffer%28xKoordinatenDerTrainingsdaten%2C%20yKoordinatenDerTrainingsdaten%2C%20axesTrainingSamplesBuffer%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%7D%0A%0A%0A%2F%2F%0A%2F%2F%20p5.js%20keyPressed%28%29%20ESC%20or%20%C2%A7%20%3D%20emergency%20stop%0A%2F%2F%0Afunction%20keyPressed%28%29%20%7B%0A%09if%20%28keyCode%20%3D%3D%3D%2027%20%7C%7C%20keyCode%20%3D%3D%3D%20192%29%20%7B%20%2F%2F%20ESC%20or%20%C2%A7%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%09drawApproximation%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=500px#FunnyFunction}} - Starte das neuronales Netz Training, indem du auf den Button ''▶Run'' klickst und etwas wartest.\\ 💡 Es kann sein, dass es das neuronale Netz nicht schafft eine Linie durch alle Punkte zu legen. Starte in diesem Fall das Training einfach noch einmal neu. Da jedes Training mit anderen, zufällig gewählten Anfangsgewichten startet, führt jedes Training zu einem anderen Resultat. \\ 💡 Es kann sein, dass die rote Linie ab und zu "springt". Das liegt daran, dass die Lernrate relativ gross eingestellt ist. Dafür läuft das Training einigermassen flott. - Stelle die ''ANZAHL_HIDDEN_NEURONS'' auf ''50'' ein. Siehst du einen Unterschied? Wie kannst du dir das erklären? {{gem/plain?0=N4XyA#d93535b2b7fd4f84}}. - Vergleiche deine Überlegungen mit ++unseren Überlegungen|\\ \\ Das neuronale Netz mit fünf Hidden Neuronen erzeugt relativ glatte Kurven. Das neuronale Netz mit 50 Hidden Neuronen erzeugt manchmal besonders in der Nähe der Trainingsdaten (Kreuze) Ecken und Kanten. Für den Fehler ist es jedoch nur wichtig, dass die Trainingsdaten möglichst gut getroffen werden. Ob die rote Kurve neben den Trainingspunkten noch weitere Ecken und Kanten aufweist, spielt für den Fehler keine Rolle. Ein neuronales Netz mit "nur" fünf Hidden Neuronen kann nicht allzu viel lernen, dies genügt gerade um genügend viele Kurven zu erzeugen um die Aufgabe zu lösen, daher sieht diese Lösung "glatt" aus. Mit 50 Hidden Neuronen kann das neuronale Netz noch viel kompliziertere Funktionen erlernen, daher kann es sein, das es zufällig ausserhalb der Kreuze Ecken und Kanten bildet. Wo das neuronale Netz keine Daten hat, macht es irgendetwas...\\ \\ ++. - Wenn du Lust hast, darfst du eigene Trainingspunkte eingeben. Es gehören immer eine x-Koordinate und eine y-Koordinate zusammen (die erste x-Koordinate gehört zur ersten y-Koordinate, die zweite zur Zweiten usw.), daher braucht es gleich viele x-Koordinaten wie y-Koordinaten. Viel Spass! === Eigene Notizen === {{gem/quill#3c8fe014b815befc}}