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 8022b38..35af928 100755 Binary files a/Startcode/runMatrixTests and b/Startcode/runMatrixTests differ diff --git a/Startcode/runNeuralNetworkTests b/Startcode/runNeuralNetworkTests index 15b6417..6602606 100755 Binary files a/Startcode/runNeuralNetworkTests and b/Startcode/runNeuralNetworkTests differ