jacobian

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

commit 547b48dba0d910049c1ebb78aceed69029b96d29
parent cdcdf1619565fc23db0d86272464abbb75eb809f
Author: David Freifeld <freifeld.david@gmail.com>
Date:   Fri, 10 Jul 2020 15:02:19 -0700

Switch to floats for speedups

Diffstat:
Mbpnn.cpp | 41++++++++++++++++++++++++-----------------
Mbpnn.hpp | 19++++++++++---------
Mexample.cpp | 4++--
Mutils.cpp | 24------------------------
4 files changed, 36 insertions(+), 52 deletions(-)

diff --git a/bpnn.cpp b/bpnn.cpp @@ -11,25 +11,25 @@ Layer::Layer(int batch_sz, int nodes) { - contents = new Eigen::MatrixXd (batch_sz, nodes); - dZ = new Eigen::MatrixXd (batch_sz, nodes); + contents = new Eigen::MatrixXf (batch_sz, nodes); + dZ = new Eigen::MatrixXf (batch_sz, nodes); int datalen = batch_sz*nodes; for (int i = 0; i < datalen; i++) { (*contents)((int)i / nodes,i%nodes) = 0; (*dZ)((int)i / nodes,i%nodes) = 0; } - bias = new Eigen::MatrixXd (batch_sz, nodes); + bias = new Eigen::MatrixXf (batch_sz, nodes); for (int i = 0; i < nodes; i++) { for (int j = 0; j < batch_sz; j++) { (*bias)(j, i) = 0; } } - dZ = new Eigen::MatrixXd (batch_sz, nodes); + dZ = new Eigen::MatrixXf (batch_sz, nodes); } void Layer::init_weights(Layer next) { - weights = new Eigen::MatrixXd (contents->cols(), next.contents->cols()); + weights = new Eigen::MatrixXf (contents->cols(), next.contents->cols()); int nodes = weights->cols(); int n = contents->cols() + next.contents->cols(); std::normal_distribution<float> d(0,sqrt(1.0/n)); @@ -103,13 +103,13 @@ void Network::add_layer(int nodes, char* name) void Network::initialize() { - labels = new Eigen::MatrixXd (batch_size,layers[length-1].contents->cols()); + labels = new Eigen::MatrixXf (batch_size,layers[length-1].contents->cols()); for (int i = 0; i < length-1; i++) { layers[i].init_weights(layers[i+1]); } } -void Network::set_activation(int index, std::function<double(double)> custom, std::function<double(double)> custom_deriv) +void Network::set_activation(int index, std::function<float(float)> custom, std::function<float(float)> custom_deriv) { layers[index].activation = custom; layers[index].activation_deriv = custom_deriv; @@ -169,9 +169,9 @@ float Network::accuracy() void Network::backpropagate() { - std::vector<Eigen::MatrixXd> gradients; - std::vector<Eigen::MatrixXd> deltas; - Eigen::MatrixXd error = ((*layers[length-1].contents) - (*labels)); + std::vector<Eigen::MatrixXf> gradients; + std::vector<Eigen::MatrixXf> deltas; + Eigen::MatrixXf error = ((*layers[length-1].contents) - (*labels)); gradients.push_back(error.cwiseProduct(*layers[length-1].dZ)); deltas.push_back((*layers[length-2].contents).transpose() * gradients[0]); int counter = 1; @@ -181,7 +181,7 @@ void Network::backpropagate() counter++; } for (int i = 0; i < length-1; i++) { - *layers[length-2-i].weights -= learning_rate * deltas[i]; + *layers[length-2-i].weights -= (learning_rate * deltas[i]) + (learning_rate * deltas[i]); *layers[length-1-i].bias -= bias_lr * gradients[i]; } } @@ -292,11 +292,18 @@ float Network::test(char* path) return 0; } -void Network::begin() -{ - Network sim = *this; - //printf("Beginning train on %i instances for %i epochs...\n", instances, total_epochs); -} +// void Network::begin() +// { +// Network sim = *this; +// for (int i = 0; i < sim.layers.size()-1; i++) { +// // sim.layers[i].weights +// for (int j = 0; i < sim.layers[i].weights.rows(); i++) { +// for (int k = 0; i < sim.layers[i].weights.cols(); i++) { +// } +// } +// } +// //printf("Beginning train on %i instances for %i epochs...\n", instances, total_epochs); +// } void Network::train() { @@ -315,7 +322,7 @@ void Network::train() epoch_acc = 1.0/((float) instances/batch_size) * acc_sum; epoch_cost = 1.0/((float) instances/batch_size) * cost_sum; test(TEST_PATH); - printf("Epoch complete - cost %f - acc %f - val_cost %f - val_acc %f\n", epoch_cost, epoch_acc, val_cost, val_acc); + // printf("Epoch complete - cost %f - acc %f - val_cost %f - val_acc %f\n", epoch_cost, epoch_acc, val_cost, val_acc); batches=1; rewind(data); } diff --git a/bpnn.hpp b/bpnn.hpp @@ -16,13 +16,13 @@ class Layer { public: - Eigen::MatrixXd* contents; - Eigen::MatrixXd* weights; - Eigen::MatrixXd* bias; - Eigen::MatrixXd* dZ; - std::vector<Eigen::MatrixXd> prev_updates; - std::function<double(double)> activation; - std::function<double(double)> activation_deriv; + Eigen::MatrixXf* contents; + Eigen::MatrixXf* weights; + Eigen::MatrixXf* bias; + Eigen::MatrixXf* dZ; + std::vector<Eigen::MatrixXf> prev_updates; + std::function<float(float)> activation; + std::function<float(float)> activation_deriv; char activation_str[1024]; Layer(int rows, int columns); @@ -46,16 +46,17 @@ public: float val_cost; float learning_rate; float bias_lr; + float lambda; int batch_size; int batches; - Eigen::MatrixXd* labels; + Eigen::MatrixXf* labels; Network(char* path, int batch_sz, float learn_rate, float bias_rate, float ratio); void add_layer(int nodes, char* activation); void initialize(); void update_layer(float* vals, int datalen, int index); - void set_activation(int index, std::function<double(double)> custom, std::function<double(double)> custom_deriv); + void set_activation(int index, std::function<float(float)> custom, std::function<float(float)> custom_deriv); void feedforward(); void list_net(); diff --git a/example.cpp b/example.cpp @@ -11,7 +11,7 @@ double bench(int batch_sz) net.add_layer(5, "relu"); net.add_layer(1, "resig"); net.initialize(); - net.begin(); + // net.begin(); for (int i = 0; i < 50; i++) { net.train(); } @@ -22,7 +22,7 @@ double bench(int batch_sz) int main() { - bench(50); + std::cout << bench(50) << "\n"; // bench(50); // bench(50); // bench(50); diff --git a/utils.cpp b/utils.cpp @@ -57,27 +57,3 @@ std::function<double(double)> rectifier(double (*activation)(double)) return rectified; } -Eigen::MatrixXd strassen_mul(Eigen::MatrixXd x, Eigen::MatrixXd y) -{ - int apower; - int bpower; - for (;a - //Eigen::MatrixXd a () - int block_len = a.rows()/2; - Eigen::MatrixXd result (a.rows(), a.cols()); - - Eigen::MatrixXd m1 = ((a.block(0,0, block_len, block_len)) + a.block(a.rows()-block_len,a.cols()-block_len, block_len, block_len)) * (b.block(0,0, block_len, block_len) + b.block(b.rows()-block_len,b.cols()-block_len, block_len, block_len)); - Eigen::MatrixXd m2 = (a.block(a.rows()-block_len, 0, block_len, block_len) + a.block(a.rows()-block_len,a.cols()-block_len, block_len, block_len)) * (b.block(0,0, block_len, block_len)); - Eigen::MatrixXd m3 = a.block(0,0, block_len, block_len) * (b.block(0,b.cols()-block_len, block_len, block_len) - b.block(b.rows()-block_len,b.cols()-block_len, block_len, block_len)); - Eigen::MatrixXd m4 = a.block(a.rows()-block_len,a.cols()-block_len, block_len, block_len) * (b.block(b.rows()-block_len,0, block_len, block_len) - b.block(0,0, block_len, block_len)); - Eigen::MatrixXd m5 = (a.block(0, 0, block_len, block_len) + a.block(0,a.cols()-block_len, block_len, block_len)) * (b.block(b.rows()-block_len,b.cols()-block_len, block_len, block_len)); - Eigen::MatrixXd m6 = (a.block(a.rows()-block_len,0, block_len, block_len) - a.block(0,0, block_len, block_len)) * (b.block(0,0, block_len, block_len) + b.block(0,b.cols()-block_len, block_len, block_len)); - Eigen::MatrixXd m7 = (a.block(0,a.cols()-block_len, block_len, block_len) - a.block(a.rows()-block_len,a.cols()-block_len, block_len, block_len)) * (b.block(a.rows()-block_len,0, block_len, block_len) + b.block(b.rows()-block_len,b.cols()-block_len, block_len, block_len)); - - result.block(0,0, block_len, block_len) = m1 + m4 - m5 + m7; - result.block(0,result.cols()-block_len, block_len, block_len) = m3 + m5; - result.block(result.rows()-block_len,0, block_len, block_len) = m2 + m4; - result.block(result.rows()-block_len,result.cols()-block_len, block_len, block_len) = m1 -m2 + m3 + m6; - - return result; -}