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:
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;
}