commit 482219a024553a9bdb161894972e35c86f561e83
parent 8470beaa2072bcdda5e5c3b438411e2e44b19ebd
Author: David Freifeld <freifeld.david@gmail.com>
Date: Thu, 25 Jun 2020 13:03:22 -0700
New construction works properly
Diffstat:
2 files changed, 10 insertions(+), 21 deletions(-)
diff --git a/bpnn.cpp b/bpnn.cpp
@@ -66,6 +66,7 @@ void Network::add_layer(int nodes, char* activation)
void Network::initialize()
{
+ labels = new Eigen::MatrixXd (batch_size,layers[length-1].contents->cols());
for (int i = 0; i < length-1; i++) {
layers[i].init_weights(layers[i+1]);
}
@@ -115,7 +116,6 @@ void Network::feedforward()
}
}
}
- // std::cout << "\n\nDONE\n\n";
}
void Network::list_net()
@@ -150,33 +150,21 @@ float Network::accuracy()
void Network::backpropagate()
{
- // printf("Entering?\n");
std::vector<Eigen::MatrixXd> gradients;
std::vector<Eigen::MatrixXd> deltas;
- // std::cout << *labels << "\n" << *layers[length-1].contents << "\n\n\n";
Eigen::MatrixXd error = ((*layers[length-1].contents) - (*labels));
- // std::cout << error << "\n" << *layers[length-1].dZ << "\n\n\n";
gradients.push_back(error.cwiseProduct(*layers[length-1].dZ));
deltas.push_back((*layers[length-2].contents).transpose() * gradients[0]);
int counter = 1;
for (int i = length-2; i >= 1; i--) {
gradients.push_back((gradients[counter-1] * layers[i].weights->transpose()).cwiseProduct(*layers[i].dZ));
- //std::cout << gradients[counter] << "\n" << layers[i-1].contents->transpose() << " " << counter << "\n?\n\n";
deltas.push_back(layers[i-1].contents->transpose() * gradients[counter]);
counter++;
}
for (int i = 0; i < length-1; i++) {
Eigen::MatrixXd gradient = gradients[i];
- // printf("Test2?\n");
- // std::cout << "Batch sz: " << batch_size << "\n";
- //std::cout << "Comparing " << length-3-i << " " <<length-2-i << " " << i << "\n";
- //std::cout << deltas[i] << "DELTABOVE\n\n" << layers[length-2-i].contents->transpose() << "X_T\n\n" << *layers[length-2-i].weights << "WEIGHT2\n\n" << gradients[i] << "GRAD\n\n";
*layers[length-2-i].weights -= learning_rate * deltas[i];
- *layers[length-1-i].bias -= learning_rate * gradients[i];
- // printf("Test2.5?\n");
- //std::cout << deltas[i] << "\n\n" << *layers[length-2-i].bias << "(layer "<< length-2-i << " cuz " << length << " - 2 - " << i << ")\n";
- // *layers[length-2-i].bias -= learning_rate * (deltas[i]);
- // printf("Test3?\n");
+ *layers[length-1-i].bias -= bias_lr * gradients[i];
}
}
@@ -288,13 +276,13 @@ void Network::train(int total_epochs)
float cost_sum = 0;
float acc_sum = 0;
for (int i = 0; i <= instances-batch_size; i+=batch_size) {
+ if (i != instances-batch_size) { // Don't try to advance batch on final batch.
+ next_batch();
+ }
feedforward();
backpropagate();
cost_sum += cost();
acc_sum += accuracy();
- if (i != instances-batch_size) { // Don't try to advance batch on final batch.
- next_batch();
- }
batches++;
}
epoch_accuracy = 1.0/((float) instances/batch_size) * acc_sum;
diff --git a/example.cpp b/example.cpp
@@ -3,14 +3,15 @@
int main()
{
- Network net ("./extra.txt", 10, 1, 0.01);
+ Network net ("./extra.txt", 10, 0.5, 0.1);
net.add_layer(4, "linear");
net.add_layer(5, "sigmoid");
- net.add_layer(3, "sigmoid");
+ // net.add_layer(3, "sigmoid");
net.add_layer(1, "resig");
- net.list_net();
- //net.train(50);
+ net.initialize();
//net.list_net();
+ net.train(50);
+ // net.list_net();
//char line[1024];
//net.stream->getline(line, 1024);
//std::cout << line << "\n";