jacobian

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

commit 74c8a4630056abd6ee6df40935fe391bece52f4f
parent 757192251eee3763c010b0bfb80b2912eaf0f2ca
Author: David Freifeld <freifeld.david@gmail.com>
Date:   Mon, 21 Sep 2020 11:40:14 -0700

Switched to faster file read, 30% overall speedup

Bug spotted, random stopping at epochs

Diffstat:
Msrc/bpnn.cpp | 20+-------------------
Msrc/bpnn.hpp | 4++++
Msrc/data.cpp | 20+++++++++++++++++---
Msrc/utils.cpp | 14--------------
Msrc/utils.hpp | 2+-
5 files changed, 23 insertions(+), 37 deletions(-)

diff --git a/src/bpnn.cpp b/src/bpnn.cpp @@ -339,24 +339,7 @@ float Network::validate(char* path) float costsum = 0; float accsum = 0; for (int i = 0; i <= val_instances-batch_size; i+=batch_size) { - char line[MAXLINE]; - int inputs = layers[0].contents->cols(); - int datalen = batch_size * inputs; - float batch[datalen]; - int label = -1; - for (int i = 0; i < batch_size; i++) { - - fgets(line, MAXLINE, val_data); - char *p; - p = strtok(line,","); - for (int j = 0; j < inputs; j++) { - batch[j + (i * inputs)] = strtod(p, NULL); - p = strtok(NULL,","); - } - (*labels)(i, 0) = strtod(p, NULL); - } - float* batchptr = batch; - update_layer(batchptr, datalen, 0); + next_batch(); feedforward(); costsum += cost(); accsum += accuracy(); @@ -369,7 +352,6 @@ float Network::validate(char* path) void Network::train() { - rewind(data); float cost_sum = 0; float acc_sum = 0; for (int i = 0; i <= instances-batch_size; i+=batch_size) { diff --git a/src/bpnn.hpp b/src/bpnn.hpp @@ -14,6 +14,10 @@ #include <fstream> #include <random> #include <algorithm> +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <unistd.h> #define BUFFER_SIZE 16*1024 enum Regularization {L1, L2}; diff --git a/src/data.cpp b/src/data.cpp @@ -1,14 +1,28 @@ +typedef float val_t; +inline float scan(char **p) +{ + float n; + int neg = 1; + while (!isdigit(**p) && **p != '-' && **p != '.') ++*p; + if (**p == '-') neg = -1, ++*p; + for (n=0; isdigit(**p); ++*p) (n *= 10) += (**p-'0'); + if (*(*p)++ != '.') return n*neg; + float d = 1; + for (; isdigit(**p); ++*p) n += (d /= 10) * (**p-'0'); + return n*neg; +} + int Network::next_batch() { - uintmax_t lines = 0 - while(size_t bytes_read = read(fd, buf, BUFFER_SIZE)) + uintmax_t lines = 0; + while(size_t bytes_read = read(data, buf, BUFFER_SIZE)) { if (!bytes_read) break; for(char *p = buf; lines < 10;) { char* bound = (char*) memchr(p, '\n', (buf + bytes_read) - p); if (bound - p < 0) break; // Stop. for (int i=0; i<layers[0].contents->cols(); ++i) (*layers[0].contents)(lines,i) = scan(&p); - labels (lines,0) = scan(&p); + (*labels)(lines,0) = scan(&p); p = bound + 1; ++lines; } diff --git a/src/utils.cpp b/src/utils.cpp @@ -88,20 +88,6 @@ std::function<float(float)> rectifier(float (*activation)(float)) return rectified; } -typedef float val_t; -inline float scan(char **p) -{ - float n; - int neg = 1; - while (!isdigit(**p) && **p != '-' && **p != '.') ++*p; - if (**p == '-') neg = -1, ++*p; - for (n=0; isdigit(**p); ++*p) (n *= 10) += (**p-'0'); - if (*(*p)++ != '.') return n*neg; - float d = 1; - for (; isdigit(**p); ++*p) n += (d /= 10) * (**p-'0'); - return n*neg; -} - #if (AVX) // Intel intrinsics for the win! Eigen::MatrixXf avx_product(Eigen::MatrixXf a, Eigen::MatrixXf b) diff --git a/src/utils.hpp b/src/utils.hpp @@ -46,7 +46,7 @@ Eigen::MatrixXf avx_cpow(Eigen::MatrixXf m, float exponent); Eigen::MatrixXf avx_tanh(Eigen::MatrixXf m); Eigen::MatrixXf avx_cosh(Eigen::MatrixXf m); -inline float scan(char **p); Eigen::MatrixXf strassen_mul(Eigen::MatrixXf a, Eigen::MatrixXf b); #endif /* MODULE_H */ +