#include #include "neuralnet_impl.h" #include #include #include "test.h" #include "test_util.h" #include TEST_CASE(neuralnet_train_linear_perceptron_non_origin_test) { const int num_layers = 1; const int input_size = 1; const nnLayer layers[] = { {.type = nnLinear, .linear = {.input_size = 1, .output_size = 1}} }; nnNeuralNetwork* net = nnMakeNet(layers, num_layers, input_size); assert(net); // Train. // Try to learn the Y = 2X + 1 line. #define N 2 const R inputs[N] = {0., 1.}; const R targets[N] = {1., 3.}; nnMatrix inputs_matrix = nnMatrixMake(N, 1); nnMatrix targets_matrix = nnMatrixMake(N, 1); nnMatrixInit(&inputs_matrix, inputs); nnMatrixInit(&targets_matrix, targets); nnTrainingParams params = { .learning_rate = 0.7, .max_iterations = 20, .seed = 0, .weight_init = nnWeightInit01, .debug = false, }; nnTrain(net, &inputs_matrix, &targets_matrix, ¶ms); const R weight = nnMatrixAt(&net->layers[0].linear.weights, 0, 0); const R expected_weight = 2.0; printf( "\nTrained network weight: %f, Expected: %f\n", weight, expected_weight); TEST_TRUE(double_eq(weight, expected_weight, WEIGHT_EPS)); const R bias = nnMatrixAt(&net->layers[0].linear.biases, 0, 0); const R expected_bias = 1.0; printf("Trained network bias: %f, Expected: %f\n", bias, expected_bias); TEST_TRUE(double_eq(bias, expected_bias, WEIGHT_EPS)); // Test. nnQueryObject* query = nnMakeQueryObject(net, 1); const R test_input[] = {2.3}; R test_output[1]; nnQueryArray(net, query, test_input, test_output); const R expected_output = test_input[0] * expected_weight + expected_bias; printf("Output: %f, Expected: %f\n", test_output[0], expected_output); TEST_TRUE(double_eq(test_output[0], expected_output, OUTPUT_EPS)); nnDeleteQueryObject(&query); nnDeleteNet(&net); }