jacobian

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

commit 7a768c84a15b1b8c178cac3f12b3a02350aa2d14
parent 7c598661b0d483eb00b84a56aaf12eaaf12ffa6c
Author: David Freifeld <freifeld.david@gmail.com>
Date:   Sun, 28 Mar 2021 19:03:21 -0700

C++ and formatting tweaks

Diffstat:
MCMakeLists.txt | 12++++++++----
Msrc/bpnn.cpp | 9++++-----
Msrc/bpnn.hpp | 10+++-------
Msrc/data.cpp | 2+-
Msrc/optimizers.cpp | 8++++----
Msrc/utils.cpp | 6+++---
6 files changed, 23 insertions(+), 24 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt @@ -1,5 +1,7 @@ cmake_minimum_required(VERSION 3.10.0) +project(jacobian) + set(CMAKE_CXX_COMPILER "g++") set(CMAKE_CXX_STANDARD 20) @@ -10,7 +12,7 @@ if (DEBUG) else() set(COMPILE_FLAGS, "-w") endif() - + if (FAST) set(COMPILE_FLAGS "${COMPILE_FLAGS} -O3") elseif (FASTER) @@ -21,10 +23,13 @@ elseif (RECKLESS) set(COMPILE_FLAGS "${COMPILE_FLAGS} -mavx -O3 -mavx -msse2 -msse3 -march=native -mfpmath=sse -DMKL_ILP64 -D NDEBUG -ffast-math -D RECKLESS") endif() -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${COMPILE_FLAGS} -fPIE") +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${COMPILE_FLAGS}") + +find_package(Eigen3 REQUIRED) +include_directories(${EIGEN3_INCLUDE_DIR}) +message("Found Eigen3: ${EIGEN3_INCLUDE_DIR}") if (PYTHON) - project(jacobian) find_package(pybind11 CONFIG REQUIRED) include_directories(${pybind11_INCLUDE_DIRS}) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC") @@ -32,6 +37,5 @@ if (PYTHON) endif (PYTHON) if (CXX) - project(jacobian_cli) add_executable(jacobian_cli example.cpp ./src/bpnn.cpp ./src/utils.cpp) endif (CXX) diff --git a/src/bpnn.cpp b/src/bpnn.cpp @@ -7,12 +7,10 @@ #include "bpnn.hpp" #include "utils.hpp" -#include <atomic> -#include <chrono> -#include <ctime> #include <random> Layer::Layer(int batch_sz, int nodes) + :weights(nullptr), v(nullptr), m(nullptr) { contents = new Eigen::MatrixXf (batch_sz, nodes); dZ = new Eigen::MatrixXf (batch_sz, nodes); @@ -45,7 +43,8 @@ void Layer::init_weights(Layer next) } Network::Network(const char* path, int batch_sz, float learn_rate, float bias_rate, Regularization regularization, float l, float ratio, bool early_exit, float cutoff) - :batch_size(batch_sz), learning_rate(learn_rate), bias_lr(bias_rate), reg_type(regularization), lambda(l), early_stop(early_exit), threshold(cutoff) + :batch_size(batch_sz), learning_rate(learn_rate), bias_lr(bias_rate), reg_type(regularization), + lambda(l), early_stop(early_exit), threshold(cutoff) { Expects(batch_size > 0 && learning_rate > 0 && bias_rate > 0 && l >= 0 && ratio >= 0 && ratio <= 1); @@ -57,7 +56,7 @@ Network::Network(const char* path, int batch_sz, float learn_rate, float bias_ra val_data = open(VAL_BIN_PATH, O_RDONLY | O_NONBLOCK); instances = total_instances - val_instances; decay = []() -> void {}; - update = [](Layer& layer, Eigen::MatrixXf delta, float learning_rate) { + update = [](const Layer& layer, const Eigen::MatrixXf delta, const float learning_rate) { *layer.weights -= (learning_rate * delta); }; // File descriptors are nonnegative integers and open() returns -1 on failure. diff --git a/src/bpnn.hpp b/src/bpnn.hpp @@ -1,7 +1,7 @@ #ifndef BPNN_H #define BPNN_H -#include <eigen3/Eigen/Dense> +#include <Eigen/Dense> #include <vector> #include <iostream> @@ -9,12 +9,9 @@ #include <cstdio> #include <cmath> #include <random> -#include <algorithm> #include <sys/types.h> -#include <sys/stat.h> #include <fcntl.h> #include <unistd.h> -#include <lz4.h> #define BUFFER_SIZE 600*1024 #define LARGE_BUF 600*1024*15 @@ -23,14 +20,13 @@ enum Regularization {L1, L2}; class Layer { public: Eigen::MatrixXf* contents; - Eigen::MatrixXf* v; - Eigen::MatrixXf* m; Eigen::MatrixXf* weights; Eigen::MatrixXf* bias; Eigen::MatrixXf* dZ; + Eigen::MatrixXf* v; + Eigen::MatrixXf* m; std::function<float(float)> activation; std::function<float(float)> activation_deriv; - char activation_str[32]; Layer(int rows, int columns); Layer(float* vals, int rows, int columns); diff --git a/src/data.cpp b/src/data.cpp @@ -35,7 +35,7 @@ void Network::next_batch(int fd) { Expects(fd > 0); // File descriptor must be valid. uintmax_t lines = 0; - while(size_t bytes_read = read(fd, buf, BUFFER_SIZE)) { + while(size_t bytes_read = read(fd, buf, BUFFER_SIZE)) { if (!bytes_read) break; p = buf; while(p < buf+BUFFER_SIZE) { diff --git a/src/optimizers.cpp b/src/optimizers.cpp @@ -7,7 +7,7 @@ std::function<void(Layer&, Eigen::MatrixXf, float)> optimizers::momentum(float beta) { - return [beta](Layer& layer, Eigen::MatrixXf delta, float learning_rate) { + return [beta](const Layer& layer, const Eigen::MatrixXf delta, const float learning_rate) { *layer.weights -= (beta * *layer.m) + (learning_rate * delta); *layer.m = (learning_rate * delta); }; @@ -17,7 +17,7 @@ std::function<void(Layer&, Eigen::MatrixXf, float)> optimizers::demon(float beta float beta_init = beta; float prev_epoch = -1; float epochs = 0; - return [max_ep, epochs, beta_init, beta](Layer& layer, Eigen::MatrixXf delta, float learning_rate) mutable { + return [max_ep, epochs, beta_init, beta](const Layer& layer, const Eigen::MatrixXf delta, const float learning_rate) mutable { beta = beta_init * (1-(epochs/max_ep)) / ((beta_init * (1-(epochs/max_ep))) + (1-beta_init)); *layer.weights -= (beta * *layer.m) + (learning_rate * delta); *layer.m = (learning_rate * delta); @@ -26,7 +26,7 @@ std::function<void(Layer&, Eigen::MatrixXf, float)> optimizers::demon(float beta } std::function<void(Layer&, Eigen::MatrixXf, float)> optimizers::adam(float beta1, float beta2, float epsilon) { - return [beta1, beta2, epsilon](Layer& layer, Eigen::MatrixXf delta, float learning_rate) { + return [beta1, beta2, epsilon](const Layer& layer, const Eigen::MatrixXf delta, const float learning_rate) { *layer.m = (beta1 * *layer.m) + ((1-beta1)*delta); *layer.v = (beta2 * *layer.v) + (1-beta2)*(delta.cwiseProduct(delta)); *layer.weights -= learning_rate * @@ -35,7 +35,7 @@ std::function<void(Layer&, Eigen::MatrixXf, float)> optimizers::adam(float beta1 } std::function<void(Layer&, Eigen::MatrixXf, float)> optimizers::adamax(float beta1, float beta2, float epsilon) { - return [beta1, beta2, epsilon](Layer& layer, Eigen::MatrixXf delta, float learning_rate) { + return [beta1, beta2, epsilon](const Layer& layer, const Eigen::MatrixXf delta, const float learning_rate) { *layer.m = (beta1 * *layer.m) + ((1-beta1)*delta); if ((beta2 * *layer.v).sum() > delta.array().abs().sum()) *layer.v = (beta2 * *layer.v); else *layer.v = delta.array().abs().matrix(); diff --git a/src/utils.cpp b/src/utils.cpp @@ -16,7 +16,7 @@ #include <fcntl.h> #include <unistd.h> #include <sys/stat.h> -#include <eigen3/Eigen/Dense> +#include <Eigen/Dense> // A bunch of hardcoded activation functions. Avoids much of the slowness of custom functions. // Although the std::function makes it not the fastest way, the functionality is worth it. @@ -80,9 +80,9 @@ float leaky_relu_deriv(float x) std::function<float(float)> rectifier(float (*activation)(float)) { auto rectified = [activation](float x) -> float - { + { if (x > 0) return (*activation)(x); - else return 0; + else return 0; }; return rectified; }