/* Takafumi Hoiruchi. 2018. https://github.com/takafumihoriuchi/MNIST_for_C */ #include #include #include #include #include // set appropriate path for data #define TRAIN_IMAGE "examples/MNIST/data/train-images.idx3-ubyte" #define TRAIN_LABEL "examples/MNIST/data/train-labels.idx1-ubyte" #define TEST_IMAGE "examples/MNIST/data/t10k-images.idx3-ubyte" #define TEST_LABEL "examples/MNIST/data/t10k-labels.idx1-ubyte" #define SIZE 784 // 28*28 #define NUM_TRAIN 60000 #define NUM_TEST 10000 #define LEN_INFO_IMAGE 4 #define LEN_INFO_LABEL 2 #define MAX_IMAGESIZE 1280 #define MAX_BRIGHTNESS 255 #define MAX_FILENAME 256 #define MAX_NUM_OF_IMAGES 1 unsigned char image[MAX_NUM_OF_IMAGES][MAX_IMAGESIZE][MAX_IMAGESIZE]; int width[MAX_NUM_OF_IMAGES], height[MAX_NUM_OF_IMAGES]; int info_image[LEN_INFO_IMAGE]; int info_label[LEN_INFO_LABEL]; unsigned char train_image_char[NUM_TRAIN][SIZE]; unsigned char test_image_char[NUM_TEST][SIZE]; unsigned char train_label_char[NUM_TRAIN][1]; unsigned char test_label_char[NUM_TEST][1]; double train_image[NUM_TRAIN][SIZE]; double test_image[NUM_TEST][SIZE]; int train_label[NUM_TRAIN]; int test_label[NUM_TEST]; void FlipLong(unsigned char * ptr) { register unsigned char val; // Swap 1st and 4th bytes val = *(ptr); *(ptr) = *(ptr+3); *(ptr+3) = val; // Swap 2nd and 3rd bytes ptr += 1; val = *(ptr); *(ptr) = *(ptr+1); *(ptr+1) = val; } void read_mnist_char(char *file_path, int num_data, int len_info, int arr_n, unsigned char data_char[][arr_n], int info_arr[]) { int i, j, k, fd; unsigned char *ptr; if ((fd = open(file_path, O_RDONLY)) == -1) { fprintf(stderr, "couldn't open image file"); exit(-1); } read(fd, info_arr, len_info * sizeof(int)); // read-in information about size of data for (i=0; i