#include "ccv.h" #include int main(int argc, char** argv) { ccv_enable_default_cache(); ccv_convnet_layer_param_t params[] = { { .type = CCV_CONVNET_CONVOLUTIONAL, .bias = 0, .glorot = sqrtf(2), .input = { .matrix = { .rows = 31, .cols = 31, .channels = 3, .partition = 1, }, }, .output = { .convolutional = { .rows = 5, .cols = 5, .channels = 3, .border = 2, .strides = 1, .count = 32, .partition = 1, }, }, }, { .type = CCV_CONVNET_LOCAL_RESPONSE_NORM, .input = { .matrix = { .rows = 31, .cols = 31, .channels = 32, .partition = 1, }, }, .output = { .rnorm = { .size = 3, .kappa = 1, .alpha = 1e-4, .beta = 0.75, }, }, }, { .type = CCV_CONVNET_MAX_POOL, .input = { .matrix = { .rows = 31, .cols = 31, .channels = 32, .partition = 1, }, }, .output = { .pool = { .size = 3, .strides = 2, .border = 0, }, }, }, { .type = CCV_CONVNET_CONVOLUTIONAL, .bias = 0, .glorot = sqrtf(2), .input = { .matrix = { .rows = 15, .cols = 15, .channels = 32, .partition = 1, }, }, .output = { .convolutional = { .rows = 5, .cols = 5, .channels = 32, .border = 2, .strides = 1, .count = 32, .partition = 1, }, }, }, { .type = CCV_CONVNET_LOCAL_RESPONSE_NORM, .input = { .matrix = { .rows = 15, .cols = 15, .channels = 32, .partition = 1, }, }, .output = { .rnorm = { .size = 3, .kappa = 1, .alpha = 1e-4, .beta = 0.75, }, }, }, { .type = CCV_CONVNET_AVERAGE_POOL, .input = { .matrix = { .rows = 15, .cols = 15, .channels = 32, .partition = 1, }, }, .output = { .pool = { .size = 3, .strides = 2, .border = 0, }, }, }, { .type = CCV_CONVNET_CONVOLUTIONAL, .bias = 0, .glorot = sqrtf(2), .input = { .matrix = { .rows = 7, .cols = 7, .channels = 32, .partition = 1, }, }, .output = { .convolutional = { .rows = 5, .cols = 5, .channels = 32, .border = 2, .strides = 1, .count = 64, .partition = 1, }, }, }, { .type = CCV_CONVNET_AVERAGE_POOL, .input = { .matrix = { .rows = 7, .cols = 7, .channels = 64, .partition = 1, }, }, .output = { .pool = { .size = 3, .strides = 2, .border = 0, }, }, }, { .type = CCV_CONVNET_FULL_CONNECT, .bias = 0, .glorot = sqrtf(2), .input = { .matrix = { .rows = 3, .cols = 3, .channels = 64, .partition = 1, }, .node = { .count = 3 * 3 * 64, }, }, .output = { .full_connect = { .relu = 0, .count = 10, }, }, }, }; ccv_convnet_t* convnet = ccv_convnet_new(1, ccv_size(32, 32), params, sizeof(params) / sizeof(ccv_convnet_layer_param_t)); assert(ccv_convnet_verify(convnet, 10) == 0); assert(argc == 5); int num1 = atoi(argv[2]); int num2 = atoi(argv[4]); FILE* r1 = fopen(argv[1], "rb"); FILE* r2 = fopen(argv[3], "rb"); if (r1 && r2) { int i, j, k; unsigned char bytes[32 * 32 + 1]; ccv_array_t* categorizeds = ccv_array_new(sizeof(ccv_categorized_t), num1, 0); for (k = 0; k < num1; k++) { fread(bytes, 32 * 32 + 1, 1, r1); int c = bytes[0]; ccv_dense_matrix_t* a = ccv_dense_matrix_new(32, 32, CCV_32F | CCV_C3, 0, 0); for (i = 0; i < 32; i++) for (j = 0; j < 32; j++) a->data.f32[(j + i * 32) * 3] = bytes[j + i * 32 + 1]; fread(bytes, 32 * 32, 1, r1); for (i = 0; i < 32; i++) for (j = 0; j < 32; j++) a->data.f32[(j + i * 32) * 3 + 1] = bytes[j + i * 32]; fread(bytes, 32 * 32, 1, r1); for (i = 0; i < 32; i++) for (j = 0; j < 32; j++) a->data.f32[(j + i * 32) * 3 + 2] = bytes[j + i * 32]; ccv_categorized_t categorized = ccv_categorized(c, a, 0); ccv_array_push(categorizeds, &categorized); } ccv_array_t* tests = ccv_array_new(sizeof(ccv_categorized_t), num2, 0); for (k = 0; k < num2; k++) { fread(bytes, 32 * 32 + 1, 1, r2); int c = bytes[0]; ccv_dense_matrix_t* a = ccv_dense_matrix_new(32, 32, CCV_32F | CCV_C3, 0, 0); for (i = 0; i < 32; i++) for (j = 0; j < 32; j++) a->data.f32[(j + i * 32) * 3] = bytes[j + i * 32 + 1]; fread(bytes, 32 * 32, 1, r2); for (i = 0; i < 32; i++) for (j = 0; j < 32; j++) a->data.f32[(j + i * 32) * 3 + 1] = bytes[j + i * 32]; fread(bytes, 32 * 32, 1, r2); for (i = 0; i < 32; i++) for (j = 0; j < 32; j++) a->data.f32[(j + i * 32) * 3 + 2] = bytes[j + i * 32]; ccv_categorized_t categorized = ccv_categorized(c, a, 0); ccv_array_push(tests, &categorized); } ccv_convnet_layer_train_param_t layer_params[9]; memset(layer_params, 0, sizeof(layer_params)); layer_params[0].w.decay = 0.005; layer_params[0].w.learn_rate = 0.001; layer_params[0].w.momentum = 0.9; layer_params[0].bias.decay = 0; layer_params[0].bias.learn_rate = 0.001; layer_params[0].bias.momentum = 0.9; layer_params[3].w.decay = 0.005; layer_params[3].w.learn_rate = 0.001; layer_params[3].w.momentum = 0.9; layer_params[3].bias.decay = 0; layer_params[3].bias.learn_rate = 0.001; layer_params[3].bias.momentum = 0.9; layer_params[6].w.decay = 0.005; layer_params[6].w.learn_rate = 0.001; layer_params[6].w.momentum = 0.9; layer_params[6].bias.decay = 0; layer_params[6].bias.learn_rate = 0.001; layer_params[6].bias.momentum = 0.9; layer_params[8].w.decay = 0.01; layer_params[8].w.learn_rate = 0.001; layer_params[8].w.momentum = 0.9; layer_params[8].bias.decay = 0; layer_params[8].bias.learn_rate = 0.001; layer_params[8].bias.momentum = 0.9; ccv_convnet_train_param_t params = { .max_epoch = 999, .mini_batch = 128, .iterations = 500, .symmetric = 1, .color_gain = 0, .device_count = 1, .layer_params = layer_params, }; ccv_convnet_supervised_train(convnet, categorizeds, tests, "cifar-10.sqlite3", params); } if (r1) fclose(r1); if (r2) fclose(r2); ccv_convnet_free(convnet); ccv_disable_cache(); return 0; }