jacobian

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

commit 5717e83ca41194bab5491c13e6399cc9e2eb67da
parent c34a57955c6a719fe7cb82b1d2303d5657b13ca2
Author: David Freifeld <freifeld.david@gmail.com>
Date:   Mon, 28 Dec 2020 19:17:56 -0800

Cleanup to silence warnings, edited Eigen includes for Arch

Diffstat:
Msrc/bpnn.cpp | 69+++++++--------------------------------------------------------------
Msrc/bpnn.hpp | 45+++++++++++++++------------------------------
Msrc/cnn.cpp | 6+++---
Msrc/cnn.hpp | 2+-
Msrc/data.cpp | 12++++++------
Msrc/optimizers.cpp | 4++--
Msrc/utils.cpp | 3+--
7 files changed, 35 insertions(+), 106 deletions(-)

diff --git a/src/bpnn.cpp b/src/bpnn.cpp @@ -12,8 +12,7 @@ #include <ctime> #include <random> -Layer::Layer(int batch_sz, int nodes, float a) - :alpha(a) +Layer::Layer(int batch_sz, int nodes) { contents = new Eigen::MatrixXf (batch_sz, nodes); dZ = new Eigen::MatrixXf (batch_sz, nodes); @@ -28,20 +27,6 @@ Layer::Layer(int batch_sz, int nodes, float a) } } -void Layer::operator=(const Layer& that) -{ - activation = that.activation; - activation_deriv = that.activation_deriv; - alpha = that.alpha; - strcpy(activation_str, that.activation_str); - *contents = *that.contents; - *v = *that.v; - *m = *that.m; - *weights = *that.weights; - *bias = *that.bias; - *dZ = *that.dZ; -} - void Layer::init_weights(Layer next) { v = new Eigen::MatrixXf (contents->cols(), next.contents->cols()); @@ -59,8 +44,8 @@ void Layer::init_weights(Layer next) } } -Network::Network(char* path, int batch_sz, float learn_rate, float bias_rate, Regularization regularization, float l, float ratio, bool early_exit, float cutoff) - :lambda(l), learning_rate(learn_rate), bias_lr(bias_rate), batch_size(batch_sz), reg_type(regularization), early_stop(early_exit), threshold(cutoff) +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) { Expects(batch_size > 0 && learning_rate > 0 && bias_rate > 0 && l >= 0 && ratio >= 0 && ratio <= 1); @@ -85,41 +70,7 @@ Network::~Network() close(val_data); } -void Network::init_decay(char* type, ...) -{ - va_list args; - va_start(args, type); - if (strcmp(type, "step") == 0) { - float a_0 = va_arg(args, double); - float k = va_arg(args, double); - decay = [this, a_0, k]() -> void { - learning_rate = a_0 * learning_rate/k; - }; - } else if (strcmp(type, "exp") == 0) { - float a_0 = va_arg(args, double); - float k = va_arg(args, double); - decay = [this, a_0, k]() -> void { - learning_rate = a_0 * exp(-k * epochs); - }; - } else if (strcmp(type, "frac") == 0) { - float a_0 = va_arg(args, double); - float k = va_arg(args, double); - decay = [this, a_0, k]() -> void { - learning_rate = a_0 / (1+(k * epochs)); - }; - } else if (strcmp(type, "linear") == 0) { - int max_ep = va_arg(args, double); - decay = [this, max_ep]() -> void { - learning_rate = 1 - epochs/max_ep; - }; - } - else std::cout << "Invalid decay function." << "\n"; - va_end(args); -} - -#include "optimizers.cpp" - -void Network::add_layer(int nodes, char* name, std::function<float(float)> activation, std::function<float(float)> activation_deriv) +void Network::add_layer(int nodes, const char* name, std::function<float(float)> activation, std::function<float(float)> activation_deriv) { Expects(nodes > 0); length++; @@ -152,12 +103,10 @@ void Network::softmax() m = (m.array() - max).matrix(); float sum = 0; for (int j = 0; j < layers[length-1].contents->cols(); j++) { - checknan(m(0,j), "input of Softmax operation"); sum += exp(m(0,j)); } for (int j = 0; j < layers[length-1].contents->cols(); j++) { m(0,j) = exp(m(0,j))/sum; - checknan(m(0,j), "output of Softmax operation"); } layers[length-1].contents->block(i,0,1,layers[length-1].contents->cols()) = m; } @@ -209,12 +158,10 @@ float Network::cost() else truth = 0; if ((*layers[length-1].contents)(i,j) == 0) (*layers[length-1].contents)(i,j) += 0.00001; tempsum += truth * log((*layers[length-1].contents)(i,j)); - checknan(tempsum, "summation for row inside cost calculation"); } sum-=tempsum; - checknan(tempsum, "total summation inside cost calculation"); } - for (int i = 0; i < layers.size()-1; i++) { + for (unsigned long i = 0; i < layers.size()-1; i++) { if (reg_type == L2) reg += layers[i].weights->cwiseProduct(*layers[i].weights).sum(); else if (reg_type == L1) reg += (layers[i].weights->array().abs().matrix()).sum(); } @@ -261,7 +208,6 @@ Eigen::MatrixXf Network::backpropagate() if (j==(*labels)(i,0)) truth = 1; else truth = 0; error(i,j) = (*layers[length-1].contents)(i,j) - truth; - checknan(error(i,j), "gradient of final layer"); } } gradients.push_back(error); @@ -286,9 +232,9 @@ Eigen::MatrixXf Network::backpropagate() #include "data.cpp" -float Network::validate(char* path) +void Network::validate(const char* path) { - if (val_instances == 0) return 0.0; + if (val_instances == 0) return; float costsum = 0; float accsum = 0; for (int i = 0; i <= val_instances-batch_size; i+=batch_size) { @@ -301,7 +247,6 @@ float Network::validate(char* path) val_cost = 1.0/(static_cast<float>(val_instances/batch_size)) * costsum; val_data = open(VAL_BIN_PATH, O_RDONLY | O_NONBLOCK); Ensures(lseek(val_data, 0, SEEK_CUR) == 0); - return 0; } void Network::train() diff --git a/src/bpnn.hpp b/src/bpnn.hpp @@ -1,7 +1,7 @@ #ifndef BPNN_H #define BPNN_H -#include <Eigen/Dense> +#include <eigen3/Eigen/Dense> //#include "../../mapreduce/mapreduce.h" @@ -16,7 +16,7 @@ #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> -#include <gsl/gsl_assert> +// #include <gsl/gsl_assert> #include <lz4.h> #define BUFFER_SIZE 600*1024 @@ -35,7 +35,7 @@ public: std::function<float(float)> activation_deriv; char activation_str[32]; - Layer(int rows, int columns, float a=0); + Layer(int rows, int columns); Layer(float* vals, int rows, int columns); void operator=(const Layer& that); void init_weights(Layer next); @@ -60,25 +60,25 @@ public: int test_instances; std::vector<Layer> layers; int length = 0; + int batch_size; float learning_rate; float bias_lr; + Regularization reg_type; float lambda; bool early_stop; float threshold; - Regularization reg_type; - int batch_size; bool silenced = false; int epochs = 0; int batches = 0; Eigen::MatrixXf* labels; - Network(char* path, int batch_sz, float learn_rate, + Network(const char* path, int batch_sz, float learn_rate, float bias_rate, Regularization regularization, float l, float ratio, bool early_exit=true, float cutoff=0); ~Network(); - void add_layer(int nodes, char* name, std::function<float(float)> activation, std::function<float(float)> activation_deriv); - void init_decay(char* type, ...); - void init_optimizer(char* name, ...); + void add_layer(int nodes, const char* name, std::function<float(float)> activation, std::function<float(float)> activation_deriv); + void init_decay(const char* type, ...); + void init_optimizer(const char* name, ...); void initialize(); void set_activation(int index, std::function<float(float)> custom, std::function<float(float)> custom_deriv); void feedforward(); @@ -87,8 +87,8 @@ public: float cost(); float accuracy(); Eigen::MatrixXf backpropagate(); - int next_batch(int fd); - float validate(char* path); + void next_batch(int fd); + void validate(const char* path); void train(); float get_acc() {return epoch_acc;} float get_val_acc() {return val_acc;} @@ -96,26 +96,11 @@ public: float get_val_cost() {return val_cost;} }; -int prep_file(char* path, char* out_path); -int split_file(char* path, int lines, float ratio); +int prep_file(const char* path, const char* out_path); +int split_file(const char* path, int lines, float ratio); -struct ValueError : public std::exception -{ - const char* message; - const char* location; - ValueError(const char* msg, const char* loc) - :message{msg}, location{loc} - { - } - const char* what() const throw () { - char* error; - sprintf(error, "%s (thrown in %s).", message, location); - const char* error_message = error; - return error_message; - } -}; -void prep(char* rname, char* wname); -void compress(char* rname, char* wname); +void prep(const char* rname, const char* wname); +void compress(const char* rname, const char* wname); Eigen::MatrixXf l1_deriv(Eigen::MatrixXf m); #define MAXLINE 1024 diff --git a/src/cnn.cpp b/src/cnn.cpp @@ -94,7 +94,7 @@ unsigned char* read_mnist_labels(std::string full_path, int number_of_labels) { } ConvLayer::ConvLayer(int x, int y, int stride, int kern_x, int kern_y, int pad, std::function<float(float)> activ, std::function<float(float)> activ_deriv) - :padding(pad), stride_len(stride), activation(activ), activation_deriv(activ_deriv) + :stride_len(stride), padding(pad), activation(activ), activation_deriv(activ_deriv) { pad*=2; input = new Eigen::MatrixXf (x+pad,y+pad); @@ -137,7 +137,7 @@ void ConvLayer::set_input(Eigen::MatrixXf* matrix) // Will eventually be different from ConvLayer PoolingLayer::PoolingLayer(int x, int y, int stride, int kern_x, int kern_y, int pad) - :padding(pad), stride_len(stride) + :stride_len(stride), padding(pad) { input = new Eigen::MatrixXf (x+pad,y+pad); for (int i = 0; i < (x+pad)*(y+pad); i++) { @@ -170,7 +170,7 @@ void PoolingLayer::pool() } } -ConvNet::ConvNet(char* path, float learn_rate, float bias_rate, Regularization reg, float l, float ratio) +ConvNet::ConvNet(const char* path, float learn_rate, float bias_rate, Regularization reg, float l, float ratio) :Network(path, 1, learn_rate, bias_rate, reg, l, ratio), preprocess_length{0} { ReadMNIST(10000,784,data); diff --git a/src/cnn.hpp b/src/cnn.hpp @@ -44,7 +44,7 @@ public: std::vector<ConvLayer> conv_layers; std::vector<PoolingLayer> pool_layers; - ConvNet(char* path, float learn_rate, float bias_rate, Regularization reg, float l, float ratio); + ConvNet(const char* path, float learn_rate, float bias_rate, Regularization reg, float l, float ratio); void list_net(); void process(); // Runs the convolutional and pooling layers. void next_batch(); diff --git a/src/data.cpp b/src/data.cpp @@ -12,7 +12,7 @@ inline float scan(char **p) return n*neg; } -void prep(char* rname, char* wname) +void prep(const char* rname, const char* wname) { FILE* wptr = fopen(wname, "wb"); FILE* rptr = fopen(rname, "rb"); @@ -31,7 +31,7 @@ void prep(char* rname, char* wname) fclose(rptr); } -int Network::next_batch(int fd) +void Network::next_batch(int fd) { Expects(fd > 0); // File descriptor must be valid. uintmax_t lines = 0; @@ -39,7 +39,7 @@ int Network::next_batch(int fd) if (!bytes_read) break; p = buf; while(p < buf+BUFFER_SIZE) { - if (lines >= 10) return 0; + if (lines >= 10) return; for (int i=0; i<layers[0].contents->cols(); ++i) { (*layers[0].contents)(lines,i) = *(reinterpret_cast<float*>(p)); p += sizeof(float); @@ -51,7 +51,7 @@ int Network::next_batch(int fd) } if (p < buf+BUFFER_SIZE) { while(p < buf+BUFFER_SIZE) { - if (lines >= 10) return 0; + if (lines >= 10) return; for (int i=0; i<layers[0].contents->cols(); ++i) { (*layers[0].contents)(lines,i) = *(reinterpret_cast<float*>(p)); p += sizeof(float); @@ -63,7 +63,7 @@ int Network::next_batch(int fd) } } -int prep_file(char* path, char* out_path) +int prep_file(const char* path, const char* out_path) { FILE* rptr = fopen(path, "r"); if (!rptr) throw std::runtime_error{"prep_file() could not open file for shuffle/read."}; @@ -88,7 +88,7 @@ int prep_file(char* path, char* out_path) return count; } -int split_file(char* path, int lines, float ratio) +int split_file(const char* path, int lines, float ratio) { FILE* src = fopen(path, "r"); if (!src) throw std::runtime_error{"split_file() could not open file to split."}; diff --git a/src/optimizers.cpp b/src/optimizers.cpp @@ -5,7 +5,7 @@ // Created by David Freifeld // -void Network::init_optimizer(char* name, ...) +void Network::init_optimizer(const char* name, ...) { va_list args; va_start(args, name); @@ -61,7 +61,7 @@ void Network::init_optimizer(char* name, ...) float epsilon = va_arg(args, double); // TODO: Add bias correction for adamax | -t coding -m (requires figuring out measuring t) update = [this, beta1, beta2, epsilon](std::vector<Eigen::MatrixXf> deltas, int i) { - *layers[length-2-i].m = (beta1 * *layers[length-2-i].m) + ((1-beta1)*deltas[i]); + *layers[length-2-i].m = (beta1 * *layers[length-2-i].m) + ((1-beta1)*deltas[i]); // TODO: Fix Adamax calculations | -p C -t quality -m Use of .sum() here is incredibly questionable. Do this correctly. if ((beta2 * *layers[length-2-i].v).sum() > deltas[i].array().abs().sum()) *layers[length-2-i].v = (beta2 * *layers[length-2-i].v); else *layers[length-2-i].v = deltas[i].array().abs().matrix(); diff --git a/src/utils.cpp b/src/utils.cpp @@ -16,8 +16,7 @@ #include <fcntl.h> #include <unistd.h> #include <sys/stat.h> -#include <Eigen/Dense> -#include <Eigen/MatrixFunctions> +#include <eigen3/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.