jacobian

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

commit 4f8ac81b687320a45ff1f7fd35f51673d51fee6f
parent 75532fb76bf8c2776736063d46aa5a7d8dba3339
Author: David Freifeld <freifeld.david@gmail.com>
Date:   Sun, 14 Jun 2020 12:11:46 -0700

Broken backprop for all weights

Diffstat:
Mtest.cpp | 35++++++++++++++++++++++++-----------
1 file changed, 24 insertions(+), 11 deletions(-)

diff --git a/test.cpp b/test.cpp @@ -175,21 +175,34 @@ float Network::cost() void Network::backpropagate() { + int N = batch_size; + std::vector<Eigen::MatrixXd> gradients; - std::vector<Eigen::MatrixXd> deltas; + std::vector<Eigen::MatrixXd> errors; Eigen::MatrixXd e = *layers[length-1].contents - *labels; - Eigen::MatrixXd D (layers[length-1].contents->rows(), 1); - for (int i = 0; i < layers[length-1].contents->rows(); i++) { - D(i, 0) = (*layers[length-1].contents)(0, i) * (1 - (*layers[length-1].contents)(0, i)); - } - D.asDiagonal(); - *layers[length-2].weights -= (layers[length-2].contents->transpose() * (D * e)); - // std::cout << D << " \n * \n " << e << "\n = \n"<< D * e; - // deltas.push_back(((*layers[length-1].contents - *labels).array() * layers[length-1].contents->array()).matrix()); - // std::cout << deltas[0].matrix() << " \n\n\n " << layers[length-2].contents->transpose();// << "\n\n\n\n" << layers[length-2].contents->transpose().dot(deltas[0]); - // std::cout << deltas[0]; + Eigen::MatrixXd D (layers[length-1].contents->cols(), layers[length-1].contents->cols()); + for (int i = 0; i < layers[length-1].contents->cols(); i++) { + D(i, i) = (*layers[length-1].contents)(0, i) * (1 - (*layers[length-1].contents)(0, i)); + } + gradients.push_back(layers[length-2].contents->transpose() * (D * e)); + std::cout << D << "\n\nTHEN\n\n" << layers[length-2].contents->transpose() << "\n\nNEXT\n\n" << e << "\n\nSO\n\n" << gradients[0] << "\n\n\n\n\n"; + int counter = 0; for (int i = length-2; i >= 0; i--) { + Eigen::MatrixXd D_l (layers[i].contents->cols(), layers[i].contents->cols()); + for (int j = 0; i < layers[i].contents->cols(); j++) { + // std::cout << *layers[i].contents << "\n\nAKA\n\n" << (*layers[i].contents)(0,j) << "\n\nTIMES\n\n" << (1 - (*layers[i].contents)(0,j)) << "FOR " << j <<"\n\n\n\n\n"; + // std::cout << j << "\n\n"; + if (j >= 5) { + break; + } + D_l(j, j) = (*layers[i].contents)(0,j) * (1 - (*layers[i].contents)(0,j)); + } + std::cout << D_l << "\n\nTHEN\n\n" << layers[i].weights->transpose() << "\n\nNEXT\n\n" << gradients[counter] << "\n\n\n\n\n\n"; + Eigen::MatrixXd e_l = D_l * (layers[i].weights->transpose() * gradients[counter]); + std::cout << "\n\nSO\n\n" << e_l << "\n\n\n\n\n"; + gradients.push_back(e_l); + counter++; } }