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:
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, ...);