initiate Neuronales_Netz
This commit is contained in:
1 parent
284cc80e9f
commit
37caf9a24e
19 files changed
+410
-3
No files matched your search
+18
@@ -0,0 +1,18 @@
|
|||||||
|
{
|
||||||
|
"configurations": [
|
||||||
|
{
|
||||||
|
"name": "linux-gcc-x64",
|
||||||
|
"includePath": [
|
||||||
|
"${workspaceFolder}/**"
|
||||||
|
],
|
||||||
|
"compilerPath": "/usr/bin/gcc",
|
||||||
|
"cStandard": "${default}",
|
||||||
|
"cppStandard": "${default}",
|
||||||
|
"intelliSenseMode": "linux-gcc-x64",
|
||||||
|
"compilerArgs": [
|
||||||
|
""
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"version": 4
|
||||||
|
}
|
||||||
Vendored
+24
@@ -0,0 +1,24 @@
|
|||||||
|
{
|
||||||
|
"version": "0.2.0",
|
||||||
|
"configurations": [
|
||||||
|
{
|
||||||
|
"name": "C/C++ Runner: Debug Session",
|
||||||
|
"type": "cppdbg",
|
||||||
|
"request": "launch",
|
||||||
|
"args": [],
|
||||||
|
"stopAtEntry": false,
|
||||||
|
"externalConsole": false,
|
||||||
|
"cwd": "/home/tommy/Desktop/Studium/3.Semester/I2-Praktikum/Playground/Neuronales_Netz",
|
||||||
|
"program": "/home/tommy/Desktop/Studium/3.Semester/I2-Praktikum/Playground/Neuronales_Netz/build/Debug/outDebug",
|
||||||
|
"MIMode": "gdb",
|
||||||
|
"miDebuggerPath": "gdb",
|
||||||
|
"setupCommands": [
|
||||||
|
{
|
||||||
|
"description": "Enable pretty-printing for gdb",
|
||||||
|
"text": "-enable-pretty-printing",
|
||||||
|
"ignoreFailures": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
+59
@@ -0,0 +1,59 @@
|
|||||||
|
{
|
||||||
|
"C_Cpp_Runner.cCompilerPath": "gcc",
|
||||||
|
"C_Cpp_Runner.cppCompilerPath": "g++",
|
||||||
|
"C_Cpp_Runner.debuggerPath": "gdb",
|
||||||
|
"C_Cpp_Runner.cStandard": "",
|
||||||
|
"C_Cpp_Runner.cppStandard": "",
|
||||||
|
"C_Cpp_Runner.msvcBatchPath": "",
|
||||||
|
"C_Cpp_Runner.useMsvc": false,
|
||||||
|
"C_Cpp_Runner.warnings": [
|
||||||
|
"-Wall",
|
||||||
|
"-Wextra",
|
||||||
|
"-Wpedantic",
|
||||||
|
"-Wshadow",
|
||||||
|
"-Wformat=2",
|
||||||
|
"-Wcast-align",
|
||||||
|
"-Wconversion",
|
||||||
|
"-Wsign-conversion",
|
||||||
|
"-Wnull-dereference"
|
||||||
|
],
|
||||||
|
"C_Cpp_Runner.msvcWarnings": [
|
||||||
|
"/W4",
|
||||||
|
"/permissive-",
|
||||||
|
"/w14242",
|
||||||
|
"/w14287",
|
||||||
|
"/w14296",
|
||||||
|
"/w14311",
|
||||||
|
"/w14826",
|
||||||
|
"/w44062",
|
||||||
|
"/w44242",
|
||||||
|
"/w14905",
|
||||||
|
"/w14906",
|
||||||
|
"/w14263",
|
||||||
|
"/w44265",
|
||||||
|
"/w14928"
|
||||||
|
],
|
||||||
|
"C_Cpp_Runner.enableWarnings": true,
|
||||||
|
"C_Cpp_Runner.warningsAsError": false,
|
||||||
|
"C_Cpp_Runner.compilerArgs": [],
|
||||||
|
"C_Cpp_Runner.linkerArgs": [],
|
||||||
|
"C_Cpp_Runner.includePaths": [],
|
||||||
|
"C_Cpp_Runner.includeSearch": [
|
||||||
|
"*",
|
||||||
|
"**/*"
|
||||||
|
],
|
||||||
|
"C_Cpp_Runner.excludeSearch": [
|
||||||
|
"**/build",
|
||||||
|
"**/build/**",
|
||||||
|
"**/.*",
|
||||||
|
"**/.*/**",
|
||||||
|
"**/.vscode",
|
||||||
|
"**/.vscode/**"
|
||||||
|
],
|
||||||
|
"C_Cpp_Runner.useAddressSanitizer": false,
|
||||||
|
"C_Cpp_Runner.useUndefinedSanitizer": false,
|
||||||
|
"C_Cpp_Runner.useLeakSanitizer": false,
|
||||||
|
"C_Cpp_Runner.showCompilationTime": false,
|
||||||
|
"C_Cpp_Runner.useLinkTimeOptimization": false,
|
||||||
|
"C_Cpp_Runner.msvcSecureNoWarnings": false
|
||||||
|
}
|
||||||
@@ -6,17 +6,157 @@
|
|||||||
#define BUFFER_SIZE 100
|
#define BUFFER_SIZE 100
|
||||||
#define FILE_HEADER_STRING "__info2_image_file_format__"
|
#define FILE_HEADER_STRING "__info2_image_file_format__"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// TODO Implementieren Sie geeignete Hilfsfunktionen für das Lesen der Bildserie aus einer Datei
|
// TODO Implementieren Sie geeignete Hilfsfunktionen für das Lesen der Bildserie aus einer Datei
|
||||||
|
|
||||||
// TODO Vervollständigen Sie die Funktion readImages unter Benutzung Ihrer Hilfsfunktionen
|
// TODO Vervollständigen Sie die Funktion readImages unter Benutzung Ihrer Hilfsfunktionen
|
||||||
GrayScaleImageSeries *readImages(const char *path)
|
GrayScaleImageSeries *readImages(const char *path)
|
||||||
{
|
{
|
||||||
GrayScaleImageSeries *series = NULL;
|
FILE* file = fopen(path, "rb");
|
||||||
|
|
||||||
|
if(file == NULL)
|
||||||
|
{
|
||||||
|
puts("could not open file.");
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!checkFileHeaderString(file))
|
||||||
|
{
|
||||||
|
puts("wrong File.");
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned short count = getCount(file);
|
||||||
|
if(!count)
|
||||||
|
{
|
||||||
|
puts("could not read number of images.");
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned short width = getWidth(file);
|
||||||
|
if(!width)
|
||||||
|
{
|
||||||
|
puts("could not read Width of images.");
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned short height = getHeight(file);
|
||||||
|
if(!height)
|
||||||
|
{
|
||||||
|
puts("could not read height of images.");
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
GrayScaleImageSeries *series = createSeries(count);
|
||||||
|
|
||||||
|
series->count = count;
|
||||||
|
unsigned short resolution = width * height;
|
||||||
|
|
||||||
|
for(unsigned int i = 0; i < series->count; i++)
|
||||||
|
{
|
||||||
|
series->images[i].width = width;
|
||||||
|
series->images[i].height = height;
|
||||||
|
|
||||||
|
series->images[i].buffer = getPixels(file, resolution);
|
||||||
|
series->labels[i] = getLabel(file);
|
||||||
|
}
|
||||||
|
|
||||||
|
fclose(file);
|
||||||
|
|
||||||
return series;
|
return series;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// TODO Vervollständigen Sie die Funktion clearSeries, welche eine Bildserie vollständig aus dem Speicher freigibt
|
// TODO Vervollständigen Sie die Funktion clearSeries, welche eine Bildserie vollständig aus dem Speicher freigibt
|
||||||
void clearSeries(GrayScaleImageSeries *series)
|
void clearSeries(GrayScaleImageSeries *series)
|
||||||
{
|
{
|
||||||
|
for(int i = 0; i < series->count; i++)
|
||||||
|
{
|
||||||
|
free(series->images[i].buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
free(series->images);
|
||||||
|
free(series->labels);
|
||||||
|
free(series);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int checkFileHeaderString(FILE *file)
|
||||||
|
{
|
||||||
|
char buffer[strlen(FILE_HEADER_STRING)];
|
||||||
|
|
||||||
|
fread(buffer, sizeof(char), strlen(FILE_HEADER_STRING), file);
|
||||||
|
|
||||||
|
for(int i = 0; i < strlen(FILE_HEADER_STRING); i++)
|
||||||
|
{
|
||||||
|
if(buffer[i] != FILE_HEADER_STRING[i])
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned short getCount(FILE *file)
|
||||||
|
{
|
||||||
|
unsigned short count = 0;
|
||||||
|
|
||||||
|
fread(&count, sizeof(unsigned short), 1, file);
|
||||||
|
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned short getWidth(FILE *file)
|
||||||
|
{
|
||||||
|
unsigned short width = 0;
|
||||||
|
|
||||||
|
fread(&width, sizeof(unsigned short), 1, file);
|
||||||
|
|
||||||
|
return width;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned short getHeight(FILE *file)
|
||||||
|
{
|
||||||
|
unsigned short height = 0;
|
||||||
|
|
||||||
|
fread(&height, sizeof(unsigned short), 1, file);
|
||||||
|
|
||||||
|
return height;
|
||||||
|
}
|
||||||
|
|
||||||
|
GrayScaleImageSeries *createSeries(unsigned short count)
|
||||||
|
{
|
||||||
|
GrayScaleImage *images = (GrayScaleImage*) calloc(count, sizeof(GrayScaleImage));
|
||||||
|
unsigned char *labels = (unsigned char*) calloc(count, sizeof(unsigned char));
|
||||||
|
|
||||||
|
GrayScaleImageSeries *series = (GrayScaleImageSeries*) calloc(1, sizeof(GrayScaleImageSeries));
|
||||||
|
series->images = images;
|
||||||
|
series->labels = labels;
|
||||||
|
|
||||||
|
return series;
|
||||||
|
}
|
||||||
|
|
||||||
|
GrayScalePixelType *getPixels(FILE *file, unsigned short resolution)
|
||||||
|
{
|
||||||
|
GrayScalePixelType *pixels = (GrayScalePixelType*) calloc(resolution, sizeof(GrayScalePixelType));
|
||||||
|
|
||||||
|
fread(pixels, sizeof(GrayScalePixelType), resolution, file);
|
||||||
|
|
||||||
|
return pixels;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned char getLabel(FILE *file)
|
||||||
|
{
|
||||||
|
unsigned char label = '\0';
|
||||||
|
|
||||||
|
fread(&label, sizeof(unsigned char), 1, file);
|
||||||
|
|
||||||
|
return label;
|
||||||
}
|
}
|
||||||
@@ -19,5 +19,12 @@ typedef struct
|
|||||||
|
|
||||||
GrayScaleImageSeries *readImages(const char *path);
|
GrayScaleImageSeries *readImages(const char *path);
|
||||||
void clearSeries(GrayScaleImageSeries *series);
|
void clearSeries(GrayScaleImageSeries *series);
|
||||||
|
int checkFileHeaderString(FILE *file);
|
||||||
|
unsigned short getCount(FILE *file);
|
||||||
|
unsigned short getWidth(FILE *file);
|
||||||
|
unsigned short getHeight(FILE *file);
|
||||||
|
GrayScaleImageSeries *createSeries(unsigned short count);
|
||||||
|
GrayScalePixelType *getPixels(FILE *file, unsigned short resolution);
|
||||||
|
unsigned char getLabel(FILE *file);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
Binary file not shown.
@@ -119,6 +119,26 @@ void test_readImagesFailsOnWrongFileTag(void)
|
|||||||
remove(path);
|
remove(path);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void test_readImagesReturnsCorrectPixels(void)
|
||||||
|
{
|
||||||
|
GrayScalePixelType expectedResult = 0;
|
||||||
|
|
||||||
|
GrayScaleImageSeries *series = NULL;
|
||||||
|
const char *path = "testFile.info2";
|
||||||
|
prepareImageFile(path, 8, 8, 2, 0);
|
||||||
|
series = readImages(path);
|
||||||
|
|
||||||
|
for (int i = 0; i < 2; i++)
|
||||||
|
{
|
||||||
|
for(int j = 0; j < 8 * 8; j++)
|
||||||
|
{
|
||||||
|
TEST_ASSERT_EQUAL_UINT8(expectedResult, series->images[i].buffer[j]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
clearSeries(series);
|
||||||
|
remove(path);
|
||||||
|
}
|
||||||
|
|
||||||
void setUp(void) {
|
void setUp(void) {
|
||||||
// Falls notwendig, kann hier Vorbereitungsarbeit gemacht werden
|
// Falls notwendig, kann hier Vorbereitungsarbeit gemacht werden
|
||||||
}
|
}
|
||||||
@@ -138,6 +158,8 @@ int main()
|
|||||||
RUN_TEST(test_readImagesReturnsCorrectLabels);
|
RUN_TEST(test_readImagesReturnsCorrectLabels);
|
||||||
RUN_TEST(test_readImagesReturnsNullOnNotExistingPath);
|
RUN_TEST(test_readImagesReturnsNullOnNotExistingPath);
|
||||||
RUN_TEST(test_readImagesFailsOnWrongFileTag);
|
RUN_TEST(test_readImagesFailsOnWrongFileTag);
|
||||||
|
RUN_TEST(test_readImagesReturnsCorrectPixels);
|
||||||
|
|
||||||
|
|
||||||
return UNITY_END();
|
return UNITY_END();
|
||||||
}
|
}
|
||||||
Binary file not shown.
+103
-1
@@ -3,33 +3,135 @@
|
|||||||
#include "matrix.h"
|
#include "matrix.h"
|
||||||
|
|
||||||
// TODO Matrix-Funktionen implementieren
|
// TODO Matrix-Funktionen implementieren
|
||||||
|
// typedef struct
|
||||||
|
// {
|
||||||
|
// unsigned int *buffer;
|
||||||
|
// unsigned int rows;
|
||||||
|
// unsigned int cols;
|
||||||
|
// } Matrix;
|
||||||
|
|
||||||
|
|
||||||
Matrix createMatrix(unsigned int rows, unsigned int cols)
|
Matrix createMatrix(unsigned int rows, unsigned int cols)
|
||||||
{
|
{
|
||||||
|
if(rows == 0 || cols == 0)
|
||||||
|
{
|
||||||
|
Matrix noMatrix = {NULL, 0, 0};
|
||||||
|
|
||||||
|
return noMatrix;
|
||||||
|
}
|
||||||
|
|
||||||
|
Matrix matrix = {(MatrixType *)calloc(rows * cols, sizeof(int)) ,rows, cols};
|
||||||
|
|
||||||
|
return matrix;
|
||||||
}
|
}
|
||||||
|
|
||||||
void clearMatrix(Matrix *matrix)
|
void clearMatrix(Matrix *matrix)
|
||||||
{
|
{
|
||||||
|
free(matrix->buffer);
|
||||||
|
matrix->rows = 0;
|
||||||
|
matrix->cols = 0;
|
||||||
|
matrix->buffer = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void setMatrixAt(MatrixType value, Matrix matrix, unsigned int rowIdx, unsigned int colIdx)
|
void setMatrixAt(MatrixType value, Matrix matrix, unsigned int rowIdx, unsigned int colIdx)
|
||||||
{
|
{
|
||||||
|
if(rowIdx >= matrix.rows || colIdx >= matrix.cols)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
matrix.buffer[matrix.cols * rowIdx + colIdx] = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
MatrixType getMatrixAt(const Matrix matrix, unsigned int rowIdx, unsigned int colIdx)
|
MatrixType getMatrixAt(const Matrix matrix, unsigned int rowIdx, unsigned int colIdx)
|
||||||
{
|
{
|
||||||
|
if(rowIdx >= matrix.rows || colIdx >= matrix.cols)
|
||||||
|
{
|
||||||
|
return UNDEFINED_MATRIX_VALUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
MatrixType matrixAt = matrix.buffer[matrix.cols * rowIdx + colIdx];
|
||||||
|
|
||||||
|
return matrixAt;
|
||||||
}
|
}
|
||||||
|
|
||||||
Matrix add(const Matrix matrix1, const Matrix matrix2)
|
Matrix add(const Matrix matrix1, const Matrix matrix2)
|
||||||
{
|
{
|
||||||
|
if(matrix1.rows == matrix2.rows && matrix1.cols == matrix2.cols)
|
||||||
|
{
|
||||||
|
Matrix matrixSum = createMatrix(matrix1.rows, matrix1.cols);
|
||||||
|
|
||||||
|
for(int i = 0; i < matrix1.rows; i++)
|
||||||
|
{
|
||||||
|
for(int j = 0; j < matrix1.cols; j++)
|
||||||
|
{
|
||||||
|
MatrixType value = getMatrixAt(matrix1, i, j) + getMatrixAt(matrix2, i, j);
|
||||||
|
|
||||||
|
setMatrixAt(value, matrixSum, i, j);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
return matrixSum;
|
||||||
|
}
|
||||||
|
|
||||||
|
if((matrix1.cols == 1 || matrix2.cols == 1) && matrix1.rows == matrix2.rows)
|
||||||
|
{
|
||||||
|
if(matrix1.cols == 1)
|
||||||
|
{
|
||||||
|
return broadcasting(matrix2, matrix1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return broadcasting(matrix1, matrix2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Matrix failedMatrix = createMatrix(0, 0);
|
||||||
|
|
||||||
|
return failedMatrix;
|
||||||
|
}
|
||||||
|
|
||||||
|
Matrix broadcasting(const Matrix matrix, const Matrix vector)
|
||||||
|
{
|
||||||
|
Matrix matrixSum = createMatrix(matrix.rows, matrix.cols);
|
||||||
|
|
||||||
|
for(int i = 0; i < vector.rows; i++)
|
||||||
|
{
|
||||||
|
for(int j = 0; j < matrix.cols; j++)
|
||||||
|
{
|
||||||
|
MatrixType value = getMatrixAt(matrix, i, j) + getMatrixAt(vector, i, 0);
|
||||||
|
|
||||||
|
setMatrixAt(value, matrixSum, i, j);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return matrixSum;
|
||||||
}
|
}
|
||||||
|
|
||||||
Matrix multiply(const Matrix matrix1, const Matrix matrix2)
|
Matrix multiply(const Matrix matrix1, const Matrix matrix2)
|
||||||
{
|
{
|
||||||
|
if(matrix1.cols != matrix2.rows)
|
||||||
|
{
|
||||||
|
Matrix failedMatrix = createMatrix(0, 0);
|
||||||
|
|
||||||
|
return failedMatrix;
|
||||||
|
}
|
||||||
|
|
||||||
|
Matrix matrixRes = createMatrix(matrix1.rows, matrix2.cols);
|
||||||
|
|
||||||
|
for(int i = 0; i < matrixRes.rows; i++)
|
||||||
|
{
|
||||||
|
for(int j = 0; j < matrixRes.cols; j++)
|
||||||
|
{
|
||||||
|
MatrixType sum = 0;
|
||||||
|
|
||||||
|
for(int k = 0; k < matrix1.cols; k++)
|
||||||
|
{
|
||||||
|
MatrixType product = getMatrixAt(matrix1, i, k) * getMatrixAt(matrix2, k, j);
|
||||||
|
|
||||||
|
sum += product;
|
||||||
|
}
|
||||||
|
setMatrixAt(sum, matrixRes, i, j);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return matrixRes;
|
||||||
}
|
}
|
||||||
@@ -6,6 +6,13 @@
|
|||||||
typedef float MatrixType;
|
typedef float MatrixType;
|
||||||
|
|
||||||
// TODO Matrixtyp definieren
|
// TODO Matrixtyp definieren
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
MatrixType *buffer;
|
||||||
|
unsigned int rows;
|
||||||
|
unsigned int cols;
|
||||||
|
|
||||||
|
} Matrix;
|
||||||
|
|
||||||
|
|
||||||
Matrix createMatrix(unsigned int rows, unsigned int cols);
|
Matrix createMatrix(unsigned int rows, unsigned int cols);
|
||||||
@@ -13,6 +20,7 @@ void clearMatrix(Matrix *matrix);
|
|||||||
void setMatrixAt(MatrixType value, Matrix matrix, unsigned int rowIdx, unsigned int colIdx);
|
void setMatrixAt(MatrixType value, Matrix matrix, unsigned int rowIdx, unsigned int colIdx);
|
||||||
MatrixType getMatrixAt(const Matrix matrix, unsigned int rowIdx, unsigned int colIdx);
|
MatrixType getMatrixAt(const Matrix matrix, unsigned int rowIdx, unsigned int colIdx);
|
||||||
Matrix add(const Matrix matrix1, const Matrix matrix2);
|
Matrix add(const Matrix matrix1, const Matrix matrix2);
|
||||||
|
Matrix broadcasting(const Matrix matrix, const Matrix vector);
|
||||||
Matrix multiply(const Matrix matrix1, const Matrix matrix2);
|
Matrix multiply(const Matrix matrix1, const Matrix matrix2);
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Binary file not shown.
Executable
BIN
Binary file not shown.
Binary file not shown.
@@ -80,7 +80,6 @@ static Matrix readMatrix(FILE *file, unsigned int rows, unsigned int cols)
|
|||||||
if(fread(matrix.buffer, sizeof(MatrixType), rows*cols, file) != rows*cols)
|
if(fread(matrix.buffer, sizeof(MatrixType), rows*cols, file) != rows*cols)
|
||||||
clearMatrix(&matrix);
|
clearMatrix(&matrix);
|
||||||
}
|
}
|
||||||
|
|
||||||
return matrix;
|
return matrix;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -146,13 +145,16 @@ NeuralNetwork loadModel(const char *path)
|
|||||||
layerBuffer = (Layer *)realloc(model.layers, (model.numberOfLayers + 1) * sizeof(Layer));
|
layerBuffer = (Layer *)realloc(model.layers, (model.numberOfLayers + 1) * sizeof(Layer));
|
||||||
|
|
||||||
if(layerBuffer != NULL)
|
if(layerBuffer != NULL)
|
||||||
|
{
|
||||||
model.layers = layerBuffer;
|
model.layers = layerBuffer;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
clearModel(&model);
|
clearModel(&model);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
model.layers[model.numberOfLayers] = layer;
|
model.layers[model.numberOfLayers] = layer;
|
||||||
model.numberOfLayers++;
|
model.numberOfLayers++;
|
||||||
|
|
||||||
|
|||||||
Binary file not shown.
@@ -9,6 +9,31 @@
|
|||||||
static void prepareNeuralNetworkFile(const char *path, const NeuralNetwork nn)
|
static void prepareNeuralNetworkFile(const char *path, const NeuralNetwork nn)
|
||||||
{
|
{
|
||||||
// TODO
|
// TODO
|
||||||
|
FILE *file = fopen(path, "wb");
|
||||||
|
|
||||||
|
if(file != NULL)
|
||||||
|
{
|
||||||
|
const char *fileTag = "__info2_neural_network_file_format__";
|
||||||
|
fwrite(fileTag, sizeof(fileTag[0]), strlen(fileTag), file);
|
||||||
|
fwrite(&nn.layers[0].weights.cols, sizeof(int), 1, file);
|
||||||
|
fwrite(&nn.layers[0].weights.rows, sizeof(int), 1, file);
|
||||||
|
|
||||||
|
for(int i = 0; i < nn.numberOfLayers; i++)
|
||||||
|
{
|
||||||
|
unsigned int sizeWeights = nn.layers[i].weights.rows * nn.layers[i].weights.cols;
|
||||||
|
unsigned int sizeBiases = nn.layers[i].biases.rows;
|
||||||
|
|
||||||
|
fwrite(nn.layers[i].weights.buffer, sizeof(MatrixType), sizeWeights, file);
|
||||||
|
fwrite(nn.layers[i].biases.buffer, sizeof(MatrixType), sizeBiases, file);
|
||||||
|
|
||||||
|
if(i < nn.numberOfLayers - 1)
|
||||||
|
{
|
||||||
|
fwrite(&nn.layers[i].weights.cols, sizeof(unsigned int), 1, file);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fclose(file);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void test_loadModelReturnsCorrectNumberOfLayers(void)
|
void test_loadModelReturnsCorrectNumberOfLayers(void)
|
||||||
|
|||||||
Executable
BIN
Binary file not shown.
Executable
BIN
Binary file not shown.
Executable
BIN
Binary file not shown.
Reference in new issue
Block a user