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:
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;
}