jacobian

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

commit d3b6ee7546635fe8cf18969329bdf6af048963ee
parent a92faf16c14b08ff92066b0630f71474b9fbe3a1
Author: David Freifeld <freifeld.david@gmail.com>
Date:   Wed, 15 Jul 2020 16:40:00 -0700

CNN pooling is broken

Diffstat:
Mexample.cpp | 2+-
Msrc/cnn.cpp | 39+++++++++++++++++++++------------------
2 files changed, 22 insertions(+), 19 deletions(-)

diff --git a/example.cpp b/example.cpp @@ -14,7 +14,7 @@ double bench(int batch_sz) { auto start = std::chrono::high_resolution_clock::now(); - Network net ("./data_banknote_authentication.txt", batch_sz, 0.1, 0.03, 0, 0.9); + Network net ("./data_banknote_authentication.txt", batch_sz, 0.05, 0.03, 0, 0.9); net.add_layer(4, "linear"); net.add_layer(6, "lecun_tanh"); net.add_layer(2, "linear"); diff --git a/src/cnn.cpp b/src/cnn.cpp @@ -105,10 +105,9 @@ public: }; ConvLayer::ConvLayer(int x, int y, int stride, int kern_x, int kern_y, int pad) + :padding(pad), stride_len(stride) { - padding = pad; pad*=2; - stride_len = stride; input = new Eigen::MatrixXf (x+pad,y+pad); for (int i = 0; i < (x+pad)*(y+pad); i++) { (*input)((int)i / (y+pad),i%(y+pad)) = 0; @@ -126,8 +125,9 @@ ConvLayer::ConvLayer(int x, int y, int stride, int kern_x, int kern_y, int pad) void ConvLayer::convolute() { - for (int i = 0; i < input->cols() - kernel->cols()+1; i+=stride_len) { - for (int j = 0; j < input->rows() - kernel->rows()+1; j+=stride_len) { + for (int i = 0; i < output->cols(); i+=stride_len) { + for (int j = 0; j < output->rows(); j+=stride_len) { + std::cout << j << ","<< i<< " vs "<< output->rows() << "," << output->cols() << "\n"; (*output)(j, i) = (*kernel * (input->block(j, i, kernel->rows(), kernel->cols()))).sum(); } } @@ -154,9 +154,12 @@ public: // Will eventually be different from ConvLayer PoolingLayer::PoolingLayer(int x, int y, int stride, int kern_x, int kern_y, int pad) + :padding(pad), stride_len(stride) { - padding = pad; - stride_len = stride; + input = new Eigen::MatrixXf (x+pad,y+pad); + for (int i = 0; i < (x+pad)*(y+pad); i++) { + (*input)((int)i / (y+pad),i%(y+pad)) = 0; + } kernel = new Eigen::MatrixXf (kern_x, kern_y); for (int i = 0; i < kern_x*kern_y; i++) { (*kernel)((int)i / kern_y,i%kern_y) = (float) rand()/RAND_MAX; @@ -247,13 +250,13 @@ void ConvNet::process() // Assumes pooling is immediately after any conv layer. for (int i = 0; i < preprocess_length-1; i++) { conv_layers[i].convolute(); - // pool_layers[i].input = conv_layers[i].output; - // pool_layers[i].pool(); + pool_layers[i].input = conv_layers[i].output; + pool_layers[i].pool(); conv_layers[i+1].input = conv_layers[i].output; } conv_layers[preprocess_length-1].convolute(); - //pool_layers[preprocess_length-1].input = conv_layers[preprocess_length-1].output; - //pool_layers[preprocess_length-1].pool(); + pool_layers[preprocess_length-1].input = conv_layers[preprocess_length-1].output; + pool_layers[preprocess_length-1].pool(); // std::cout << "Output:\n" << *pool_layers[preprocess_length-1].output << "\n\n"; Eigen::Map<Eigen::RowVectorXf> flattened (conv_layers[preprocess_length-1].output->data(), conv_layers[preprocess_length-1].output->size()); // std::cout << "Flattened:\n" << flattened << "\n\n"; @@ -271,7 +274,7 @@ void ConvNet::list_net() { for (int i = 0; i < preprocess_length; i++) { std::cout << "-----------------------\nCONVOLUTIONAL LAYER " << i << "\n-----------------------\n\n\u001b[31mGENERAL INFO:\x1B[0;37m\nStride: " << conv_layers[i].stride_len << "\nPadding: " << conv_layers[i].padding << "\n\n\u001b[31mINPUT:\x1B[0;37m\n" << *conv_layers[i].input << "\n\n\u001b[31mKERNEL:\x1B[0;37m\n" << *conv_layers[i].kernel << "\n\n\u001b[31mOUTPUT:\x1B[0;37m\n" << *conv_layers[i].output << "\n\n\u001b[31mBIAS:\x1B[0;37m\n" << conv_layers[i].bias << "\n\n\n"; - //std::cout << "-----------------------\nPOOLING LAYER " << i << "\n-----------------------\n\n\u001b[31mGENERAL INFO:\x1B[0;37m\nStride: " << pool_layers[i].stride_len << "\nPadding: " << conv_layers[i].padding << "\n\n\u001b[31mINPUT:\x1B[0;37m\n" << *pool_layers[i].input << "\n\n\u001b[31mKERNEL:\x1B[0;37m\n-" << *pool_layers[i].kernel << "\n\n\u001b[31mOUTPUT:\x1B[0;37m\n" << *pool_layers[i].output << "\n\n\n"; + std::cout << "-----------------------\nPOOLING LAYER " << i << "\n-----------------------\n\n\u001b[31mGENERAL INFO:\x1B[0;37m\nStride: " << pool_layers[i].stride_len << "\nPadding: " << conv_layers[i].padding << "\n\n\u001b[31mINPUT:\x1B[0;37m\n" << *pool_layers[i].input << "\n\n\u001b[31mKERNEL:\x1B[0;37m\n-" << *pool_layers[i].kernel << "\n\n\u001b[31mOUTPUT:\x1B[0;37m\n" << *pool_layers[i].output << "\n\n\n"; } std::cout << "-----------------------\nINPUT LAYER (LAYER 0)\n-----------------------\n\n\u001b[31mGENERAL INFO:\x1B[0;37m\nActivation Function: " << layers[0].activation_str << "\n\n\u001b[31mACTIVATIONS:\x1B[0;37m\n" << *layers[0].contents << "\n\n\u001b[31mWEIGHTS:\x1B[0;37m\n" << *layers[0].weights << "\n\n\u001b[31mBIASES:\x1B[0;37m\n" << *layers[0].bias << "\n\n\n"; for (int i = 1; i < length-1; i++) { @@ -375,19 +378,19 @@ int main() { ConvNet net ("../data_banknote_authentication.txt", 0.05, 0.01, 5, 0.9); Eigen::MatrixXf labels (1,1); - labels << 2; - net.set_label(labels); - net.add_conv_layer(28,28,1,15,15,0); - net.add_conv_layer(14,14,1,8,8,0); - // net.add_pool_layer(5,5,1,2,0); - net.add_layer(49, "sigmoid"); + net.add_conv_layer(28,28,1,9,9,0); + net.add_pool_layer(20,20,1,6,6,0); + net.add_conv_layer(15,15,1,6,6,0); + net.add_pool_layer(10,10,1,2,2,0); + net.add_layer(81, "sigmoid"); net.add_layer(5, "lecun_tanh"); net.add_layer(10, "resig"); + // net.list_net(); // net.init_decay("step", 1, 2); net.initialize(); //net.list_net(); - for (int i = 0; i < 5; i++) { + for (int i = 0; i < 1; i++) { net.train(); } net.list_net();