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