jacobian

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

commit 4dce7237a77b0153ce67d52849f503245107a8a0
parent 420ad001a1a9953d0a382603759d30b2bffd02f1
Author: David Freifeld <freifeld.david@gmail.com>
Date:   Wed,  5 Aug 2020 23:35:56 -0700

Removed memory leak + debugging

Diffstat:
Msrc/bpnn.cpp | 8+++++---
Msrc/utils.cpp | 23+++++++++++++++++------
2 files changed, 22 insertions(+), 9 deletions(-)

diff --git a/src/bpnn.cpp b/src/bpnn.cpp @@ -67,7 +67,8 @@ Network::Network(char* path, int batch_sz, float learn_rate, float bias_rate, in learning_rate = learning_rate; }; grad_calc = [this](std::vector<Eigen::MatrixXf> gradients, int i, int counter) -> void { - gradients.push_back(avx_product(gradients[counter-1] * layers[i].weights->transpose(), *layers[i].dZ)); + //gradients.push_back(avx_product(gradients[counter-1] * layers[i].weights->transpose(), *layers[i].dZ)); + gradients.push_back((gradients[counter-1] * layers[i].weights->transpose()).cwiseProduct(*layers[i].dZ)); }; update = [this](std::vector<Eigen::MatrixXf> deltas, int i) { *layers[length-2-i].weights -= (learning_rate * deltas[i]); @@ -236,7 +237,7 @@ void Network::feedforward() // std::cout << "\nGETTING SUM\n"; for (int j = 0; j < layers[length-1].contents->cols(); j++) { checknan(m(0,j), "input to final layer"); - sum += exp(m(0,j));. + sum += exp(m(0,j)); // std::cout << "Adding " << exp(m(0,j)) << "(aka e^"<< m(0, j) << ")\n"; checknan(sum, "sum in Softmax operation"); } @@ -382,7 +383,8 @@ void Network::backpropagate() for (int i = length-2; i >= 1; i--) { // TODO: Find nice way to add this // (*layers[i].weights-((learning_rate * *layers[i].weights) + (0.9 * *layers[i].v))).transpose() - grad_calc(gradients, counter, i); + //grad_calc(gradients, counter, i); + gradients.push_back(avx_product(gradients[counter-1] * layers[i].weights->transpose(), *layers[i].dZ)); deltas.push_back(layers[i-1].contents->transpose() * gradients[counter]); counter++; } diff --git a/src/utils.cpp b/src/utils.cpp @@ -97,14 +97,25 @@ Eigen::MatrixXf avx_product(Eigen::MatrixXf a, Eigen::MatrixXf b) #endif int size = ((a.rows() * a.cols()) + 7) & (-8); float arr1[size]; - //memcpy(arr1, a.data(), sizeof(float)*a.cols()*a.rows()); - std::copy(a.data(), a.data()+(a.rows()*a.cols()), arr1); + std::cout << a.cols()*a.rows() <<"\n"; + memcpy(arr1, a.data(), sizeof(float)*a.cols()*a.rows()); float arr2[size]; - std::copy(b.data(), b.data()+(b.rows()*b.cols()), arr2); - //memcpy(arr1, b.data(), sizeof(float)*b.cols()*a.rows()); - for (int i = 0; i < (((a.rows() * a.cols()) % 8) * 8) + 8; i++) { - _mm256_store_ps(arr1, _mm256_mul_ps(_mm256_load_ps(arr1+i*8), _mm256_load_ps(arr2+i*8))); + memcpy(arr2, b.data(), sizeof(float)*b.cols()*b.rows()); + for (int i = 0; i < a.cols()*a.rows(); i++) std::cout << arr1[i] << " "; + std::cout << "\n"; + for (int i = 0; i < a.cols()*a.rows(); i++) std::cout << arr2[i] << " "; + std::cout << "\n\n"; + for (int i = 0; i < size/8; i++) { + __m256 product = _mm256_mul_ps(_mm256_load_ps(arr1+i*8), _mm256_load_ps(arr2+i*8)); + std::cout << "Product:\n"; + for (int i = 0; i < 8; i++) std::cout << product[i] << " "; + std::cout << "\n"; + _mm256_store_ps(arr1, product); } + std::cout << "Product (final):\n"; + for (int i = 0; i < a.cols()*a.rows(); i++) std::cout << arr1[i] << " "; + std::cout << "\n\n\n\n"; Eigen::Map<Eigen::MatrixXf> dst (arr1, a.rows(), a.cols()); + //std::cout << a << "\n\n" << b << "\n\n" << dst << "\n\n\n\n"; return dst; }