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:
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 */
+