commit 6d4caf5d1d9fe9ce3527883e8a5339b2638baa2a
parent 3de195568e32ee4f0d8916d287833259b858a72c
Author: David Freifeld <freifeld.david@gmail.com>
Date: Sat, 13 Jun 2020 17:12:57 -0700
Backprop is frustrating
Diffstat:
| M | test.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";
}