From 08d2963bff5ae55b6f39575b34836bef8869e916 Mon Sep 17 00:00:00 2001 From: Kuber Shahi Date: Sat, 23 Oct 2021 23:16:28 +0530 Subject: [PATCH] reading data and conversion - code for reading mnist - conversion to one hot encoding --- Makefile | 24 ++++++++++++ define.hpp | 20 ++++++++++ neural_network.cpp | 0 neural_network.hpp | 0 nn | Bin 0 -> 285567 bytes nn.cpp | 96 +++++++++++++++++++++++++++++++++++++++++++++ read_data.cpp | 67 +++++++++++++++++++++++++++++++ read_data.hpp | 9 +++++ utils.cpp | 20 ++++++++++ utils.hpp | 11 ++++++ 10 files changed, 247 insertions(+) create mode 100644 Makefile create mode 100644 define.hpp create mode 100644 neural_network.cpp create mode 100644 neural_network.hpp create mode 100755 nn create mode 100644 nn.cpp create mode 100644 read_data.cpp create mode 100644 read_data.hpp create mode 100644 utils.cpp create mode 100644 utils.hpp diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..6f13d9b --- /dev/null +++ b/Makefile @@ -0,0 +1,24 @@ + +# -g adds debugging information to the executable file +# -Wall turns on most, but not all, compiler warnings + +CC = g++ +# CFLAGS = -g -Wall + +nn: read_data.o utils.o nn.o + $(CC) $(CFLAGS) read_data.o utils.o nn.o -o nn + +read_data.o: read_data.cpp read_data.hpp + $(CC) $(CFLAGS) -c read_data.cpp + +utils.o: utils.cpp utils.hpp + $(CC) $(CFLAGS) -c utils.cpp + +nn.o: nn.cpp define.hpp read_data.hpp utils.hpp + $(CC) $(CFLAGS) -c nn.cpp + + +# To start over from scratch, type 'make clean'. This removes the executable file, +# as well as old .o objectfiles and *~ backup files: +clean: + $(RM) nn file *.o *~ \ No newline at end of file diff --git a/define.hpp b/define.hpp new file mode 100644 index 0000000..f126ac9 --- /dev/null +++ b/define.hpp @@ -0,0 +1,20 @@ +#ifndef DEFINE_HPP +#define DEFINE_HPP + +#define SCALING_FACTOR 8192 // of 13 bits, 2^13 + +#include + +// Parameters for the Neural Network +extern int N_train; // Number of Training Samples +extern int N_test; // Number of Testing Samples +extern int d; // Number of Features +extern int m; // Number of Output Classes +extern int B; // Batch Size +extern int NUM_EPOCHS;// Number of Epochs + +typedef Eigen::Matrix MatrixXi64; +typedef Eigen::Matrix RowVectorXi64; +typedef Eigen::Matrix ColVectorXi64; + +#endif \ No newline at end of file diff --git a/neural_network.cpp b/neural_network.cpp new file mode 100644 index 0000000..e69de29 diff --git a/neural_network.hpp b/neural_network.hpp new file mode 100644 index 0000000..e69de29 diff --git a/nn b/nn new file mode 100755 index 0000000000000000000000000000000000000000..05819263246251af39569cbad01be04394f6ca56 GIT binary patch literal 285567 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

^eoaUfxvVz|8hl)b(Vi4n725q`QJA9nxOcSsq?J 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 QI?R9Ydy^yY9=P}a2g%A~-v9sr literal 0 HcmV?d00001 diff --git a/nn.cpp b/nn.cpp new file mode 100644 index 0000000..d5563af --- /dev/null +++ b/nn.cpp @@ -0,0 +1,96 @@ +#include +#include +#include + +#include +#include "define.hpp" +#include "read_data.hpp" +#include "utils.hpp" + +using namespace std; +using namespace Eigen; + +int main() +{ + cout<<"Select Dataset (enter corresponding digit):"<>selection; + + int N_train; // Number of Training Samples + int N_test; // Number of Testing Samples + int d; // Number of Features + int m; // Number of classes + int B; // Batch Size + int NUM_EPOCHS; // Number of Epochs + + IOFormat CleanFmt(4, 0, ", ", "\n", "[", "]"); // formatting option while printing Eigen Matrices + + MatrixXd X_train,Y_train,Y_train_onehot, X_test,Y_test, Y_test_onehot; + + if (selection==1) + { + N_train = 10000; + N_test = 1000; + d = 784; + m = 10; + B = 128; + NUM_EPOCHS = 1; + + cout<<"Reading Data:"< > X_train_load; // dim: 60000 x 784, 60000 training samples with 784 features + vector Y_train_load; // dim: 60000 x 1 , the true label of each training sample + + read_data("datasets/mnist/mnist_train.csv", X_train_load, Y_train_load); + + MatrixXd X_train_1(N_train, d); + MatrixXd Y_train_1(N_train, 1); + + for (int i = 0; i < N_train; i++) + { + X_train_1.row(i) = Map(&X_train_load[i][0], d)/256.0; + Y_train_1.row(i) = Map(&Y_train_load[i],1)/10.0; + } + + vector > X_test_load; // dim: 10000 x 784, 10000 testing samples with 784 features + vector Y_test_load; // dim: 10000 x 1 , the true label of each testing sample + + read_data("datasets/mnist/mnist_test.csv", X_test_load, Y_test_load); // for MNIST dataset + + MatrixXd X_test_1(N_test, d); // 1000, 784 + MatrixXd Y_test_1(N_test, 1); // 1000, 1 + + for (int i = 0; i < N_test; i++) + { + X_test_1.row(i) = Map(&X_test_load[i][0], d)/256.0; + Y_test_1.row(i) = Map(&Y_test_load[i],1)/10.0; + } + X_train = X_train_1; + Y_train = Y_train_1; + X_test = X_test_1; + Y_test = Y_test_1; + + Y_train_onehot = onehot_Encoding(Y_train_1,m); + Y_test_onehot = onehot_Encoding(Y_test_1,m); + + } + + + + cout << X_train.rows() << "," << X_train.cols() << endl; + cout << X_test.rows() << "," << X_test.cols() << endl; + cout << Y_train.rows() << "," << Y_train.cols() << endl; + cout << Y_train_onehot.rows() << "," << Y_train_onehot.cols() << endl; + cout << Y_test.rows() << "," << Y_test.cols() << endl; + cout << Y_test_onehot.rows() << "," << Y_test_onehot.cols() << endl; + + + cout << Y_train.block(0,0,10,1) << endl; + cout << Y_train_onehot.block(0,0,10,10) << endl; + + // cout << X_train.row(2).format(CleanFmt) < // Eigen Library + +#include // for vector operations +#include // for string operations +#include // input output operation: cout +#include // file stream operation: ifstream +#include // string stream operation: istringstream +#include // replace functionality + + +/* +Input: dataset file +Output: returns dataset, data in two-dimensional vector. +*/ + +using namespace std; + +//function to read any dataset with all numerical values like MNIST dataset. +void read_data(string inputfile, vector > &X, vector &Y) { + + ifstream fin; // declaring the input file stream + fin.open(inputfile); // opening the inputfile + + int l = 0; // declaring a integer to track the number of line + string line; // declaring a string to hold the read line of the input file + + if (fin.is_open()) { // if the input file is open + cout << "File opened successfully " << endl; + + while (getline(fin, line)){ // storing the line of input file on the variable line + l++; // increasing the line read counter + istringstream linestream(line); // converting the read line into an string stream + vector row; // declaring a vector to store the current row + + int val = 0; // declaring a variable to track the number of values in a row + while (linestream) { // while the string stream is not null + string row_value; // declaring a string to hold the row values + + if (!getline(linestream, row_value, ',')) // storing the values from stream into row_value one by one + break; // at the end of row break the while loop + try { + if (val < 784) { + row.push_back(stod(row_value)); // pushing the current value into the row for X values + val++; + } + else if (val == 784) // pushing the current value into the Y for y values + { + Y.push_back(stod(row_value)); + } + } + catch (const invalid_argument err) { // if there is a error catch the error and display it + cout << "Invalid value found in the file: " << inputfile << " line: " << l << " value: " << val << endl; + err.what(); + } + } + + X.push_back(row); // pushing the row into the dataset + row.clear(); // clearing the row vector to store the next row + } + cout << "Lines read successfully: " << l << endl; // displaying the number or lines reads from the input file + } + else{ + cout << "Unable to open the specified file " << endl; // output if file can't be opened + } +} \ No newline at end of file diff --git a/read_data.hpp b/read_data.hpp new file mode 100644 index 0000000..43c3b9a --- /dev/null +++ b/read_data.hpp @@ -0,0 +1,9 @@ +#ifndef READ_DATA_HPP +#define READ_DATA_HPP + +#include +#include + +void read_data(std::string inputfile, std::vector > &X, std::vector &Y); + +#endif \ No newline at end of file diff --git a/utils.cpp b/utils.cpp new file mode 100644 index 0000000..d4f0935 --- /dev/null +++ b/utils.cpp @@ -0,0 +1,20 @@ +#include "utils.hpp" + +#include +#include + +using namespace std; +using namespace Eigen; + +MatrixXd onehot_Encoding(MatrixXd X, int m) +{ + MatrixXd res = MatrixXd::Zero(X.rows(),m); + + for(int i =0; i < X.rows(); i++) + { + int index = X(i,0) * 10; + res(i,index) = (double) 1; + } + + return res; +} \ No newline at end of file diff --git a/utils.hpp b/utils.hpp new file mode 100644 index 0000000..5a28af1 --- /dev/null +++ b/utils.hpp @@ -0,0 +1,11 @@ +#ifndef UTILS_HPP +#define UTILS_HPP + +#include + +using namespace std; +using namespace Eigen; + +MatrixXd onehot_Encoding(MatrixXd X, int m); + +#endif \ No newline at end of file