jacobian

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

commit a92faf16c14b08ff92066b0630f71474b9fbe3a1
parent 6338610c6f712a734ba91b882cb214ffcbf3035d
Author: David Freifeld <freifeld.david@gmail.com>
Date:   Wed, 15 Jul 2020 12:49:27 -0700

Large bugfix + much better accuracy

Diffstat:
Mexample.cpp | 3+--
Msrc/bpnn.cpp | 23+++++++++--------------
2 files changed, 10 insertions(+), 16 deletions(-)

diff --git a/example.cpp b/example.cpp @@ -14,7 +14,7 @@ double bench(int batch_sz) { auto start = std::chrono::high_resolution_clock::now(); - Network net ("./data_banknote_authentication.txt", batch_sz, 0.0155, 0.03, 0, 0.9); + Network net ("./data_banknote_authentication.txt", batch_sz, 0.1, 0.03, 0, 0.9); net.add_layer(4, "linear"); net.add_layer(6, "lecun_tanh"); net.add_layer(2, "linear"); @@ -41,7 +41,6 @@ double bench(int batch_sz) int main() { - // sleep(30); std::cout << bench(16) << "\n"; // bench(50); // bench(50); diff --git a/src/bpnn.cpp b/src/bpnn.cpp @@ -146,21 +146,7 @@ void Network::set_activation(int index, std::function<float(float)> custom, std: void Network::feedforward() { - for (int j = 0; j < layers[0].contents->rows(); j++) { - if (strcmp(layers[0].activation_str, "linear") == 0) break; - for (int k = 0; k < layers[0].contents->cols(); k++) { - (*layers[0].dZ)(j,k) = layers[0].activation_deriv((*layers[0].contents)(j,k)); - (*layers[0].contents)(j,k) = layers[0].activation((*layers[0].contents)(j,k)); - } - } for (int i = 0; i < length-1; i++) { - //if (batch_size > 64 && batch_size % 4 == 0) { - // *layers[i+1].contents = strassen_mul((*layers[i].contents),(*layers[i].weights)); - //} - *layers[i+1].contents = (*layers[i].contents) * (*layers[i].weights); - *layers[i+1].contents += *layers[i+1].bias; - } - for (int i = 1; i < length; i++) { for (int j = 0; j < layers[i].contents->rows(); j++) { if (strcmp(layers[i].activation_str, "linear") == 0) break; for (int k = 0; k < layers[i].contents->cols(); k++) { @@ -168,6 +154,15 @@ void Network::feedforward() (*layers[i].contents)(j,k) = layers[i].activation((*layers[i].contents)(j,k)); } } + *layers[i+1].contents = (*layers[i].contents) * (*layers[i].weights); + *layers[i+1].contents += *layers[i+1].bias; + } + for (int j = 0; j < layers[length-1].contents->rows(); j++) { + if (strcmp(layers[length-1].activation_str, "linear") == 0) break; + for (int k = 0; k < layers[length-1].contents->cols(); k++) { + (*layers[length-1].dZ)(j,k) = layers[length-1].activation_deriv((*layers[length-1].contents)(j,k)); + (*layers[length-1].contents)(j,k) = layers[length-1].activation((*layers[length-1].contents)(j,k)); + } } // std::cout << "\nSOFTMAX INPUT\n" << *layers[length-1].contents << "\n\n"; for (int i = 0; i < layers[length-1].contents->rows(); i++) {