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:
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))