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:
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.