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