jacobian

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

commit 6d4caf5d1d9fe9ce3527883e8a5339b2638baa2a
parent 3de195568e32ee4f0d8916d287833259b858a72c
Author: David Freifeld <freifeld.david@gmail.com>
Date:   Sat, 13 Jun 2020 17:12:57 -0700

Backprop is frustrating

Diffstat:
Mtest.cpp | 55+++++++++++++++++++++++++++++++++++++------------------
1 file changed, 37 insertions(+), 18 deletions(-)

diff --git a/test.cpp b/test.cpp @@ -90,7 +90,7 @@ public: int length; int batch_size; - std::vector<int> labels; + Eigen::MatrixXd* labels; Network(char* path, int inputs, int hidden, int outputs, int neurons, int batch_sz); @@ -110,12 +110,13 @@ Network::Network(char* path, int inputs, int hidden, int outputs, int neurons, i FILE* fptr = fopen(path, "r"); int datalen = batch_sz*inputs; float batch[datalen]; + labels = new Eigen::MatrixXd (batch_sz, 1); int label; char line[1024] = {' '}; for (int i = 0; i < batch_sz; i++) { fgets(line, 1024, fptr); sscanf(line, "%f,%f,%f,%f,%i", &batch[0+(i*inputs)], &batch[1+(i*inputs)], &batch[2+(i*inputs)], &batch[3+(i*inputs)], &label); - labels.push_back(label); + (*labels)(i,0) = label; } float* batchptr = batch; layers.emplace_back(batchptr, batch_sz, inputs); @@ -132,9 +133,9 @@ 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) = 0; - } + // if ((matrix)((float)i / nodes, i%nodes) < 0) { + // (matrix)((float)i / nodes, i%nodes) = 0; + // } } return matrix; } @@ -144,7 +145,7 @@ void Network::feedforward() for (int i = 0; i < length-1; i++) { *layers[i+1].contents = (*layers[i].contents) * (*layers[i].weights); for (int j = 0; j < layers[i+1].contents->rows(); j++) { - layers[i+1].contents->row(j) += *layers[i+1].bias; + // layers[i+1].contents->row(j) += *layers[i+1].bias; } *layers[i+1].contents = activate(*layers[i+1].contents); } @@ -162,24 +163,41 @@ float Network::cost() { float sum = 0; for (int i = 0; i < layers[length-1].contents->rows(); i++) { - sum += pow(labels[i] - (*layers[length-1].contents)(i, 0),2); + sum += pow((*labels)(i, 0) - (*layers[length-1].contents)(i, 0),2); } return (1.0/batch_size) * sum; } float Network::gradient(int mode, int layer, int node) { - float N = batch_size; - if (mode == 0) { - for (int i = 0; i < N; i++) { - double label = labels[i]; - double x_i = (layers[layer].contents->row(i) / layers[layer-1].weights->col(i))(0,0) - label; - std:: - // e_i() = e_i - label; - // Eigen::MatrixXd w_i = layers[layer-1].weights->col(i); - // Eigen::MatrixXd b = layers[layer].bias; - // if (w_i.dot(x_i) + b) - } + // float N = batch_size; + // if (mode == 0) { + // for (int i = 0; i < N; i++) { + // double label = labels[i]; + // double x_i = (layers[layer].contents->row(i) / layers[layer-1].weights->col(i))(0,0) - label; + // std:: + // // e_i() = e_i - label; + // // Eigen::MatrixXd w_i = layers[layer-1].weights->col(i); + // // Eigen::MatrixXd b = layers[layer].bias; + // // if (w_i.dot(x_i) + b) + // } + // } +} + +void Network::backpropagate() +{ + std::vector<Eigen::MatrixXd> gradients; + std::vector<Eigen::MatrixXd> deltas; + 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" << deltas[0].matrix().dot(deltas[0]); + + + + + + // std::cout << deltas[0]; + for (int i = length-2; i >= 0; i--) { + } } @@ -189,5 +207,6 @@ int main() Network net ("./data_banknote_authentication.txt", 4, 2, 1, 5, 10); net.feedforward(); net.list_net(); + net.backpropagate(); std::cout << "\nCOST: " << net.cost() << "\n"; }