jacobian

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

commit dac772bf6ffacef14787fc5f3e028dd6f9f4a169
parent a7bf9066c7cac609135db72e3e64bfaefe5ac26e
Author: David Freifeld <freifeld.david@gmail.com>
Date:   Tue, 30 Jun 2020 19:16:59 -0700

Working more w/ CNNs

Diffstat:
Mcnn.cpp | 45++++++++++++++++++++++++++++++++++++++++++++-
Mexample.py | 3++-
2 files changed, 46 insertions(+), 2 deletions(-)

diff --git a/cnn.cpp b/cnn.cpp @@ -1,26 +1,69 @@ #include "bpnn.hpp" #include "utils.hpp" +#define LARGE_NUM = 1000000 // Remove me. + class ConvLayer { Eigen::MatrixXd* input; Eigen::MatrixXd* kernel; Eigen::MatrixXd* output; + +public: + void convolute(); }; + +void ConvLayer::convolute() +{ + for (int i = 0; i < input->cols() - kernel->cols() + 1; i++) { + for (int j = 0; j < input->rows() - kernel->rows() + 1; j++) { + output(j, i) = (*kernel * input->block<kernel->rows(), kernel->cols()(j, i)).sum() + } + } +} + class PoolingLayer { + Eigen::MatrixXd* input; + Eigen::MatrixXd* kernel; + Eigen::MatrixXd* output; + +public: + void pool(); }; +void PoolingLayer::pool() +{ + // It doesn't look like anything better than O(n^4) is doable for this as kernel needs to go through matrix and you need to index kernel. LOOK INTO ME!! + float maxnum = -LARGE_NUM; + for (int i = 0; i < input->cols() - kernel->cols() + 1; i++) { + for (int j = 0; j < input->rows() - kernel->rows() + 1; j++) { + for (int k = 0; k < kernel->cols(); k++) { + for (int l = 0; l < kernel->rows(); l++) { + if ((input->block<kernel->rows(), kernel->cols()(j, i))(l, k) > maxnum) { + maxnum = (input->block<kernel->rows(), kernel->cols()(j, i))(l, k); + } + } + } + } + } +} + class ConvNet : Network { + int stride_len; + + std::vector<ConvLayer> conv_layers; + std::vector<PoolingLayer> pool_layers; public: ConvNet(char* path, int batch_sz, float learn_rate, float bias_rate); }; -ConvNet::ConvNet(char* path, int batch_sz, float learn_rate, float bias_rate) +ConvNet::ConvNet(char* path, int batch_sz, float learn_rate, float bias_rate, int stride) { learning_rate = learn_rate; bias_lr = bias_rate; + stride_len = stride; instances = prep_file(path, "./shuffled.txt"); length = 0; t = 0; diff --git a/example.py b/example.py @@ -11,12 +11,13 @@ def bench(batch_sz, layers): net.add_layer(5, "relu") net.add_layer(1, "resig") net.initialize() +# net.list_net() net.train(50) end = time.time() return (end-init) timesum=0 -trials = 5 +trials = 20 for i in range(trials): timesum+=bench(10,1) print("Averages over %s trials\n--------------\nTime: %s seconds.\n" % (trials, timesum/trials))