jacobian

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README

commit 3c5fa282b5ec8210a8b9f9ba11beff8965c2cce3
parent 5e70fba38c3bce59a155aaea9dadc7809490832c
Author: David Freifeld <freifeld.david@gmail.com>
Date:   Sat,  5 Sep 2020 11:56:42 -0700

Fixes to layer add function

Diffstat:
MCMakeLists.txt | 13++++++-------
Mchecks.cpp | 27+++++++++++++++------------
Mexample.cpp | 6+++---
Msrc/bpnn.cpp | 12++++++------
Msrc/bpnn.hpp | 2+-
5 files changed, 31 insertions(+), 29 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt @@ -28,13 +28,12 @@ endif() set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${COMPILE_FLAGS} -w") - -if (PYTHON) - project(jacobian) - find_package(pybind11 CONFIG REQUIRED) - include_directories(${pybind11_INCLUDE_DIRS}) - pybind11_add_module(_jacobian example.cpp ./src/bpnn.cpp ./src/utils.cpp) -endif (PYTHON) +# if (PYTHON) +# project(jacobian) +# find_package(pybind11 CONFIG REQUIRED) +# include_directories(${pybind11_INCLUDE_DIRS}) +# pybind11_add_module(_jacobian example.cpp ./src/bpnn.cpp ./src/utils.cpp) +# endif (PYTHON) if (CXX) project(jacobian_cli) diff --git a/checks.cpp b/checks.cpp @@ -5,6 +5,7 @@ // Created by David Freifeld // +#include "./src/utils.hpp" #include "./src/bpnn.hpp" #define ZERO_THRESHOLD 5*pow(10, -5) @@ -13,9 +14,9 @@ Network default_net() { Network net ("./data_banknote_authentication.txt", 16, 0.0155, 0.03, 2, 0, 0.9); - net.add_layer(4, "linear"); - net.add_layer(5, "lecun_tanh"); - net.add_layer(2, "linear"); + net.add_layer(4, "linear", linear, linear_deriv); + net.add_layer(5, "lecun_tanh", lecun_tanh, lecun_tanh_deriv); + net.add_layer(2, "linear", linear, linear_deriv); net.init_optimizer("momentum", 0); net.initialize(); net.silenced = true; @@ -173,14 +174,14 @@ void optimizers_check(int& basic_passed, int& total_checks) std::string optimizers [5] = {"momentum", "demon", "adam", "adamax", "sgd"}; for (std::string optimizer : optimizers) { Network net ("./data_banknote_authentication.txt", 16, 0.0155, 0.03, 2, 0, 0.9); - net.add_layer(4, "linear"); - net.add_layer(5, "lecun_tanh"); - net.add_layer(2, "linear"); + net.add_layer(4, "linear", linear, linear_deriv); + net.add_layer(5, "lecun_tanh", lecun_tanh, lecun_tanh_deriv); + net.add_layer(2, "linear", linear, linear_deriv); if (optimizer == "momentum") net.init_optimizer("momentum", 0.9); - if (optimizer == "momentum") net.init_optimizer("demon", 0.9, 50); - if (optimizer == "momentum") net.init_optimizer("adam", 0.999, 0.9, pow(10,-6)); - if (optimizer == "momentum") net.init_optimizer("adamax", 0.999, 0.9, pow(10,-6)); - if (optimizer == "momentum") net.init_optimizer("sgd"); + if (optimizer == "demon") net.init_optimizer("demon", 0.9, 50); + if (optimizer == "adam") net.init_optimizer("adam", 0.999, 0.9, pow(10,-6)); + if (optimizer == "adamax") net.init_optimizer("adamax", 0.999, 0.9, pow(10,-6)); + if (optimizer == "sgd") net.init_optimizer("sgd"); net.initialize(); net.silenced=true; for (int i = 0; i < 50; i++) { @@ -205,9 +206,9 @@ void prelu_check(int& basic_passed, int& total_checks) Network net = default_net(); for (int i = 0; i < 50; i++) { Network net ("./data_banknote_authentication.txt", 16, 0.0155, 0.03, 2, 0, 0.9); - net.add_layer(4, "linear"); + net.add_layer(4, "linear", linear, linear_deriv); net.add_prelu_layer(5, 0.01); - net.add_layer(2, "linear"); + net.add_layer(2, "linear", linear, linear_deriv); net.initialize(); net.silenced=true; } @@ -236,6 +237,8 @@ void basic_checks() } } +void grad_checks() {} + // Eigen::MatrixXf Network::numerical_grad(int i, float epsilon) // { // Eigen::MatrixXf gradient (layers[i].weights->rows(), layers[i].weights->cols()); diff --git a/example.cpp b/example.cpp @@ -20,9 +20,9 @@ double bench(int batch_sz, int epochs) { auto start = std::chrono::high_resolution_clock::now(); Network net ("./data_banknote_authentication.txt", batch_sz, 0.0155, 0.03, 2, 0, 0.9); - net.add_layer(4, "linear"); - net.add_layer(5, "lecun_tanh"); - net.add_layer(2, "linear"); + net.add_layer(4, "linear", linear, linear_deriv); + net.add_layer(5, "lecun_tanh", lecun_tanh, lecun_tanh_deriv); + net.add_layer(2, "linear", linear, linear_deriv); net.initialize(); for (int i = 0; i < epochs; i++) { net.train(); diff --git a/src/bpnn.cpp b/src/bpnn.cpp @@ -63,7 +63,7 @@ void Layer::init_weights(Layer next) for (int i = 0; i < (weights->rows()*weights->cols()); i++) { std::random_device rd; std::mt19937 gen(rd()); - (*weights)((int)i / nodes, i%nodes) = d(gen); + (*weights)(static_cast<int>(i / nodes), i%nodes) = d(gen); (*v)(static_cast<int>(i / nodes), i%nodes) = 0; (*m)(static_cast<int>(i / nodes), i%nodes) = 0; } @@ -139,7 +139,7 @@ void Network::add_prelu_layer(int nodes, float a) }; } -void Network::add_layer(int nodes, std::function<float(float)> activation, std::function<float(float)> activation_deriv) +void Network::add_layer(int nodes, char* name, std::function<float(float)> activation, std::function<float(float)> activation_deriv) { length++; layers.emplace_back(batch_size, nodes); @@ -356,8 +356,8 @@ float Network::validate(char* path) costsum += cost(); accsum += accuracy(); } - val_acc = 1.0/((float) val_instances/batch_size) * accsum; - val_cost = 1.0/((float) val_instances/batch_size) * costsum; + val_acc = 1.0/(static_cast<float>(val_instances/batch_size)) * accsum; + val_cost = 1.0/(static_cast<float>(val_instances/batch_size)) * costsum; rewind(val_data); return 0; } @@ -376,8 +376,8 @@ void Network::train() acc_sum += accuracy(); batches++; } - epoch_acc = 1.0/((float) instances/batch_size) * acc_sum; - epoch_cost = 1.0/((float) instances/batch_size) * cost_sum; + epoch_acc = 1.0/(static_cast<float>(instances/batch_size)) * acc_sum; + epoch_cost = 1.0/(static_cast<float>(instances/batch_size)) * cost_sum; validate(VAL_PATH); if (silenced == false) printf("Epoch %i complete - cost %f - acc %f - val_cost %f - val_acc %f\n", epochs, epoch_cost, epoch_acc, val_cost, val_acc); batches=1; diff --git a/src/bpnn.hpp b/src/bpnn.hpp @@ -70,7 +70,7 @@ public: std::function<void(std::vector<Eigen::MatrixXf>, int)> update; Network(char* path, int batch_sz, float learn_rate, float bias_rate, int regularization, float l, float ratio, bool early_exit=true, float cutoff=0); - void add_layer(int nodes, char* activation); + void add_layer(int nodes, char* name, std::function<float(float)> activation, std::function<float(float)> activation_deriv); void add_prelu_layer(int nodes, float a); void init_decay(char* type, ...); void init_optimizer(char* name, ...);