jacobian

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

commit 358af32eaab011b242c4912f5ed68df502b8ef12
parent 0a1ea1545936fcfe1516550bb10a161ce8ac19cc
Author: David Freifeld <freifeld.david@gmail.com>
Date:   Sat, 11 Jul 2020 12:16:00 -0700

Using MNIST data

Diffstat:
Msrc/cnn.cpp | 70+++++++++++++++++++++++++++++++++++++++++++++++++++++++---------------
1 file changed, 55 insertions(+), 15 deletions(-)

diff --git a/src/cnn.cpp b/src/cnn.cpp @@ -216,35 +216,75 @@ void ConvNet::backpropagate() conv_layers[0].bias -= gradients[gradients.size()-1].sum(); } +using namespace std; +int ReverseInt (int i) +{ + unsigned char ch1, ch2, ch3, ch4; + ch1=i&255; + ch2=(i>>8)&255; + ch3=(i>>16)&255; + ch4=(i>>24)&255; + return((int)ch1<<24)+((int)ch2<<16)+((int)ch3<<8)+ch4; +} +void ReadMNIST(int NumberOfImages, int DataOfAnImage,vector<vector<double>> &arr) +{ + arr.resize(NumberOfImages,vector<double>(DataOfAnImage)); + ifstream file ("./t10k-images-idx3-ubyte",ios::binary); + if (file.is_open()) + { + int magic_number=0; + int number_of_images=0; + int n_rows=0; + int n_cols=0; + file.read((char*)&magic_number,sizeof(magic_number)); + magic_number= ReverseInt(magic_number); + file.read((char*)&number_of_images,sizeof(number_of_images)); + number_of_images= ReverseInt(number_of_images); + file.read((char*)&n_rows,sizeof(n_rows)); + n_rows= ReverseInt(n_rows); + file.read((char*)&n_cols,sizeof(n_cols)); + n_cols= ReverseInt(n_cols); + for(int i=0;i<number_of_images;++i) + { + for(int r=0;r<n_rows;++r) + { + for(int c=0;c<n_cols;++c) + { + unsigned char temp=0; + file.read((char*)&temp,sizeof(temp)); + arr[i][(n_rows*r)+c]= (double)temp; + } + } + } + } +} + int main() { ConvNet net ("../data_banknote_authentication.txt", 1, 0.05, 0.01, 0, 0.9); Eigen::MatrixXf labels (1,1); labels << 1; net.set_label(labels); - net.add_conv_layer(8,8,1,4,2,0); + net.add_conv_layer(28,28,1,4,4,0); //net.add_pool_layer(5,5,1,2,0); - net.add_layer(25, "linear"); + net.add_layer(625, "linear"); net.add_layer(5, "relu"); net.add_layer(1, "resig"); net.initialize(); - Eigen::MatrixXf* input = new Eigen::MatrixXf (8,8); - *input << - 0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0, - 0,0,1,1,1,1,0,0, - 0,0,1,1,1,1,0,0, - 0,0,1,1,1,1,0,0, - 0,0,1,1,1,1,0,0, - 0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0; + + Eigen::MatrixXf* input = new Eigen::MatrixXf (28,28); + vector<vector<double>> ar; + ReadMNIST(10000,784,ar); + for (int i = 0; i < 784; i++) { + (*input)(i/28, i%28) = ar[1][i]; + } + std::cout << "\n\n" << *input << "\n"; + net.conv_layers[0].set_input(input); net.process(); for (int i = 0; i < 10; i++) { net.feedforward(); net.backpropagate(); - std::cout << *net.layers[net.layers.size()-1].contents << " <--- ACTIVATION\n"; + printf("Epoch %i complete - cost %f - acc %f\n", net.epochs, net.cost(), net.accuracy()); } - net.list_net(); - // net.list_net(); }