jacobian

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

commit 2b640e4300d651bbceb4ca5d39729ee9b14e89b9
parent 9502b96fb20003c4f2e9ee8ae0a67f6ae2200e71
Author: David Freifeld <freifeld.david@gmail.com>
Date:   Wed, 24 Jun 2020 16:53:38 -0700

Working on custom activation functions

Diffstat:
Mbpnn.cpp | 41++++++++---------------------------------
Mbpnn.hpp | 12++++++++----
Mutils.cpp | 11+++++++++++
3 files changed, 27 insertions(+), 37 deletions(-)

diff --git a/bpnn.cpp b/bpnn.cpp @@ -1,4 +1,5 @@ #include "bpnn.hpp" +#include "utils.hpp" #include <ctime> Layer::Layer(float* vals, int batch_sz, int nodes) @@ -37,7 +38,6 @@ void Layer::initWeights(Layer next) } } -// Testing 123 Network::Network(char* path, int inputs, int hidden, int outputs, int neurons, int batch_sz, float rate) { learning_rate = rate; @@ -64,35 +64,11 @@ Network::Network(char* path, int inputs, int hidden, int outputs, int neurons, i for (int i = 0; i < hidden+1; i++) { layers[i].initWeights(layers[i+1]); } - batches = 1; -} - -Eigen::MatrixXd Network::activate(Eigen::MatrixXd matrix) -{ - int nodes = matrix.cols(); - for (int i = 0; i < (matrix.rows()*matrix.cols()); i++) { - if ((matrix)((float)i / nodes, i%nodes) > 0) { - (matrix)((float)i / nodes, i%nodes) = 1.0/(1+exp(-(matrix)((float)i / nodes, i%nodes))); - } - else { - (matrix)((float)i / nodes, i%nodes) = 0; - } - } - return matrix; -} - -Eigen::MatrixXd Network::activate_deriv(Eigen::MatrixXd matrix) -{ - int nodes = matrix.cols(); - for (int i = 0; i < (matrix.rows()*matrix.cols()); i++) { - if ((matrix)((float)i / nodes, i%nodes) > 0) { - (matrix)((float)i / nodes, i%nodes) = 1.0/(1+exp(-(matrix)((float)i / nodes, i%nodes))) * (1 - 1.0/(1+exp(-(matrix)((float)i / nodes, i%nodes)))); - } - else { - (matrix)((float)i / nodes, i%nodes) = 0; - } + for (int i = 0; i < hidden+2; i++) { + layers[i].activation = &sigmoid; + layers[i].activation_deriv = &sigmoid_deriv; } - return matrix; + batches = 1; } void Network::feedforward() @@ -102,8 +78,8 @@ void Network::feedforward() for (int j = 0; j < layers[i+1].contents->rows(); j++) { // layers[i+1].contents->row(j) += *layers[i+1].bias; TODO ADD ME BACK! } - *layers[i+1].contents = activate(*layers[i+1].contents); - *layers[i+1].dZ = activate_deriv(*layers[i+1].contents); + *layers[i+1].contents = (*layers[i+1]->activation)(*layers[i+1].contents); + *layers[i+1].dZ = (*layers[i+1]->activate_deriv)(*layers[i+1].contents); } } @@ -338,4 +314,4 @@ void demo(int total_epochs) // net.list_net(); //net.list_net(); // printf("Test accuracy: %f\n", net.test("./test.txt")); -} -\ No newline at end of file +} diff --git a/bpnn.hpp b/bpnn.hpp @@ -1,3 +1,6 @@ +#ifndef BPNN_H +#define BPNN_H + #include "/Users/davidfreifeld/Downloads/eigen-3.3.7/Eigen/Dense" extern "C" { @@ -19,6 +22,8 @@ public: Eigen::MatrixXd* weights; Eigen::MatrixXd* bias; Eigen::MatrixXd* dZ; + double (*activation)(double); + double (*activation_deriv)(double); Layer(float* vals, int rows, int columns); Layer(int rows, int columns); @@ -41,8 +46,6 @@ public: Network(char* path, int inputs, int hidden, int outputs, int neurons, int batch_sz, float rate); void update_layer(float* vals, int datalen, int index); - Eigen::MatrixXd activate(Eigen::MatrixXd matrix); - Eigen::MatrixXd activate_deriv(Eigen::MatrixXd matrix); Eigen::MatrixXd init_ones(Eigen::MatrixXd matrix); void feedforward(); void list_net(); @@ -56,4 +59,6 @@ public: }; void demo(int total_epochs); -int prep_file(char* path, char* out_path); -\ No newline at end of file +int prep_file(char* path, char* out_path); + +#endif /* MODULE_H */ diff --git a/utils.cpp b/utils.cpp @@ -2,11 +2,22 @@ #include <fstream> #include <cstdlib> #include <ctime> +#include <cmath> #include <cstdio> #include <fcntl.h> #include <unistd.h> #include <sys/stat.h> +double sigmoid(double x) +{ + return 1.0/(1+exp(-x)); +} + +double sigmoid_deriv(double x) +{ + return 1.0/(1+exp(-x)) * (1 - 1.0/(1+exp(x))); +} + static uintmax_t wc(char const *fname) { static const auto BUFFER_SIZE = 16*1024;