From 8ee8de57d913bdc6f810c4e38d59f82b4da46da7 Mon Sep 17 00:00:00 2001 From: ScheuerleinNico Date: Mon, 9 Nov 2026 16:54:53 +0100 Subject: [PATCH] =?UTF-8?q?Habe=20meine=20neuralNetworkTests.c=20=C3=BCber?= =?UTF-8?q?arbeitet.=20Hatte=20das=20Speichern=20der=20Layer=20falsch=20in?= =?UTF-8?q?=20Zeilen=20und=20Spalten=20statt=20fertige=20Werte.=208=20Test?= =?UTF-8?q?s=20laufen=20jetzt=20alle=20ohne=20fails=20durch.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Startcode/neuralNetworkTests.c | 51 +++++++++++++++++++------------- Startcode/runMatrixTests | Bin 65832 -> 65848 bytes Startcode/runNeuralNetworkTests | Bin 78608 -> 82928 bytes 3 files changed, 31 insertions(+), 20 deletions(-) diff --git a/Startcode/neuralNetworkTests.c b/Startcode/neuralNetworkTests.c index e4da80f..8e88183 100644 --- a/Startcode/neuralNetworkTests.c +++ b/Startcode/neuralNetworkTests.c @@ -18,33 +18,44 @@ static void prepareNeuralNetworkFile(const char *path, const NeuralNetwork nn) } /*---Indifikationstag an den Anfang schreiben---*/ - const char *fileTag = "info2_neural_network_file_format"; //Der Text der laut Angabe am Anfang der Datei stehen muss - fwrite(fileTag, sizeof(char), strlen(fileTag), file); //Schreibbefehl mit Parametern (Vorgegebener Text soll geschrieben werden (Adresse), Größe eines Buchstaben, Länge des Textes, Zielort "file") + const char *fileTag = "__info2_neural_network_file_format__"; //Der Text der laut Angabe am Anfang der Datei stehen muss + fwrite(fileTag, sizeof(char), strlen(fileTag), file); //Schreibbefehl mit Parametern (Vorgegebener Text soll geschrieben werden (Adresse), Größe eines Buchstaben, Länge des Textes, Zielort "file") - /*---Anzahl der Layer speichern---*/ - fwrite(&nn.numberOfLayers, sizeof(int), 1, file); //Schreibbefehl mit Parametern (Die Adresse von "nn.numberOfLayers" soll geschrieben werden, eine ganze Zahl als "int" wird abgespeichert, es wird genau eine solche Zahl geschrieben, Zielort "file") - - /*---Schleife für jeden Layer um Gewichte und Bias zu speichern---*/ - for(int i = 0; i < nn.numberOfLayers; i++) //Schleife von 0 bis Anzahl der Layer + if(nn.numberOfLayers > 0) //Daten schreiben nur starten, wenn das Netz Layers besitzt { - Layer layer = nn.layers[i]; //Benutzt aktuellen Layer mit Nummer "i" und benutzt Hilfsvariable "layer" + /*---Erste Eingabe-Dimension schreiben---*/ + unsigned int inputDim = nn.layers[0].weights.cols; //Speichere den Wert des ersten Layers in "inputDim" + fwrite(&inputDim, sizeof(int), 1, file); //Schreibe 4 Bytes aus den Wert der Adresse "inputDim" als ganze Zahl in die Datei "file" - /*---Weights speichern---*/ - fwrite(&layer.weights.rows, sizeof(int), 1, file); //Schreibbefehl mit Parametern mit (Anzahl Zeilen Weights (Adresse), eine ganze Zahl als "int" abspeichern, es wird genau eine solche Zahl gespeichert, Zielort "file") --> Speichert ab, wie viele Zeilen Gewichts-Tabelle hat - fwrite(&layer.weights.cols, sizeof(int), 1, file); //Schreibbefehl mit Parametern mit (Anzahl Spalten Weights (Adresse), eine ganze Zahl als "int" abspeichern, es wird genau eine solche Zahl gespeichert, Zielort "file") --> Speichert ab, wie viele Spalten Gewichts-Tabelle hat + /*---Schleife für jeden Layer um Gewichte und Bias zu speichern---*/ + for(int i = 0; i < nn.numberOfLayers; i++) //Schleife von 0 bis Anzahl der Layer + { + Layer layer = nn.layers[i]; //Benutzt aktuellen Layer mit Nummer "i" und benutzt Hilfsvariable "layer" - int weightCount = layer.weights.rows * layer.weights.cols; //Berechnet die Gesamtzahl der Zahlen in der Weight Tabelle + /*---Output-Dimension dieses Layers schreiben---*/ + unsigned int outputDim = layer.weights.rows; //Speichere die Anzahl der Zeilen in "outputDim" + fwrite(&outputDim, sizeof(int), 1, file); //Schreibe 4 Bytes den Wert der Adresse "outputDim" als ganze Zahl in die Datei "file" - fwrite(layer.weights.buffer, sizeof(MatrixType), weightCount, file); //Schreibbefehl mit Parametern mit (Weight Buffer (Adresse), eine ganze Zahl in "MatrixType" abspeichern, es wird der zuvor berechnete Wert gespeichert, Zielort "file") --> Speichert alle eigentlichen Zahlenwerte der Weights auf einmal in die Datei. Buffer ist bereits intern ein Zeiger, deswegen kein "&" + /*---Weights Buffer speichern---*/ + int weightCount = layer.weights.rows * layer.weights.cols; //Berechnet die Gesamtzahl der Zahlen in der Weight Tabelle + fwrite(layer.weights.buffer, sizeof(MatrixType), weightCount, file); //Schreibe den Wert der Adresse "layer.weights.buffer" als Typ von "MatrixType" mit der Anzahl von "weightCount" in die Datei "file" --> Speichert alle eigentlichen Zahlenwerte der Weights auf einmal in die Datei. Buffer ist bereits intern ein Zeiger, deswegen kein "&" + /*---Bias Buffer speichern---*/ + int biasCount = layer.biases.rows * layer.biases.cols; //Berechnet die Gesamtzahl der Zahlen in der Bias Tabelle + fwrite(layer.biases.buffer, sizeof(MatrixType), biasCount, file); //Schreibe den Wert der Adresse "layer.biases.buffer" als Typ von "MatrixType" mit der Anzahl von "biasCount" in die Datei "file" --> Speichert alle eigentlichen Zahlenwerte der Weights auf einmal in die Datei. Buffer ist bereits intern ein Zeiger, deswegen kein "&" + } - /*---Bias speichern---*/ - fwrite(&layer.biases.rows, sizeof(int), 1, file); //Schreibbefehl mit Parametern mit (Anzahl Zeilen Bias (Adresse), eine ganze Zahl als "int" abspeichern, es wird genau eine solche Zahl gespeichert, Zielort "file") --> Speichert ab, wie viele Zeilen Bias-Tabelle hat - fwrite(&layer.biases.cols, sizeof(int), 1, file); //Schreibbefehl mit Parametern mit (Anzahl Spalten Bias (Adresse), eine ganze Zahl als "int" abspeichern, es wird genau eine solche Zahl gespeichert, Zielort "file") --> Speichert ab, wie viele Spalten Bias-Tabelle hat + /*---Schreiben aller Layers beenden---*/ + unsigned int terminator = 0; //Speichere den Wert 0 in "terminator" + fwrite(&terminator, sizeof(int), 1, file); //Schreibe den Wert der Adresse "terminator" im Binärformat in die Datei "file" + } - int biasCount = layer.biases.rows * layer.biases.cols; //Berechnet die Gesamtzahl der Zahlen in der Bias Tabelle - - fwrite(layer.biases.buffer, sizeof(MatrixType), biasCount, file); //Schreibbefehl mit Parametern mit (Bias Buffer (Adresse), eine ganze Zahl in "MatrixType" abspeichern, es wird der zuvor berechnete Wert gespeichert, Zielort "file") --> Speichert alle eigentlichen Zahlenwerte der Weights auf einmal in die Datei. Buffer ist bereits intern ein Zeiger, deswegen kein "&" + else + { + /*---Fehlerhafte Layer---*/ + unsigned int zero = 0; //Speichere den Wert 0 in "zero" + fwrite(&zero, sizeof(int), 1, file); //0 als inputDimension + fwrite(&zero, sizeof(int), 1, file); //0 als outputDimension } /*---Datei wieder schließen---*/ @@ -193,7 +204,7 @@ void test_loadModelFailsOnWrongFileTag(void) if(file != NULL) { - const char *fileTag = "info2_neural_network_file_format"; + const char *fileTag = "__info2_neural_network_file_format__"; fwrite(fileTag, sizeof(char), strlen(fileTag), file); diff --git a/Startcode/runMatrixTests b/Startcode/runMatrixTests index 8022b38dc9d54fb918d9293bd1363c23fbf0ece7..35af928e0edc275139832ba9a447e46b25dec62c 100755 GIT binary patch delta 392 zcmZ3{#ImD_Wr7CdkByrC%p%`|tt+={y^C?pmA^e<*@n0}-uerhdzgc3Ss8$UZ}XFe zNDkIrV5U>&A6C|QMv$m;f4H(bA5gRrh&zFpiBX=3AFKt)0fK2DVm=TvZrprulOvNe zNbzAHeg?$+Kr`T)I6;OpfC&qrIHLoQVDbbK%mE+*Y*09m#j((_8gBpQ4K!%|j zlnzwI2qyA@ET#$|!Q2WWKwK8EW99%^jNzM2b~q|a%CZGL;(nsM?0CickzEG(OK?#d`LE}81dXwIlGwUN=DF=6UKAlW^gk&#gy E0D)3o_y7O^ delta 379 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 ZXS8CS^pIxW9e~cB?InALcW*kY|9=M*xS9X} delta 26561 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 D9P$BF