// Alex's Model
ccv_convnet_layer_param_t alex_params[13] = {
	// first layer (convolutional => max pool => rnorm)
	{
		.type = CCV_CONVNET_CONVOLUTIONAL,
		.bias = 0,
		.glorot = 1.41421356237, // sqrtf(2)
		.input = {
			.matrix = {
				.rows = 225,
				.cols = 225,
				.channels = 3,
				.partition = 1,
			},
		},
		.output = {
			.convolutional = {
				.count = 96,
				.strides = 4,
				.border = 1,
				.rows = 11,
				.cols = 11,
				.channels = 3,
				.partition = 2,
			},
		},
	},
	{
		.type = CCV_CONVNET_LOCAL_RESPONSE_NORM,
		.input = {
			.matrix = {
				.rows = 55,
				.cols = 55,
				.channels = 96,
				.partition = 2,
			},
		},
		.output = {
			.rnorm = {
				.size = 5,
				.kappa = 2,
				.alpha = 1e-4,
				.beta = 0.75,
			},
		},
	},
	{
		.type = CCV_CONVNET_MAX_POOL,
		.input = {
			.matrix = {
				.rows = 55,
				.cols = 55,
				.channels = 96,
				.partition = 2,
			},
		},
		.output = {
			.pool = {
				.strides = 2,
				.size = 3,
				.border = 0,
			},
		},
	},
	// second layer (convolutional => max pool => rnorm)
	{
		.type = CCV_CONVNET_CONVOLUTIONAL,
		.bias = 1,
		.glorot = 1.41421356237, // sqrtf(2)
		.input = {
			.matrix = {
				.rows = 27,
				.cols = 27,
				.channels = 96,
				.partition = 2,
			},
		},
		.output = {
			.convolutional = {
				.count = 256,
				.strides = 1,
				.border = 2,
				.rows = 5,
				.cols = 5,
				.channels = 96,
				.partition = 2,
			},
		},
	},
	{
		.type = CCV_CONVNET_LOCAL_RESPONSE_NORM,
		.input = {
			.matrix = {
				.rows = 27,
				.cols = 27,
				.channels = 256,
				.partition = 2,
			},
		},
		.output = {
			.rnorm = {
				.size = 5,
				.kappa = 2,
				.alpha = 1e-4,
				.beta = 0.75,
			},
		},
	},
	{
		.type = CCV_CONVNET_MAX_POOL,
		.input = {
			.matrix = {
				.rows = 27,
				.cols = 27,
				.channels = 256,
				.partition = 2,
			},
		},
		.output = {
			.pool = {
				.strides = 2,
				.size = 3,
				.border = 0,
			},
		},
	},
	// third layer (convolutional)
	{
		.type = CCV_CONVNET_CONVOLUTIONAL,
		.bias = 0,
		.glorot = 1.41421356237, // sqrtf(2)
		.input = {
			.matrix = {
				.rows = 13,
				.cols = 13,
				.channels = 256,
				.partition = 1,
			},
		},
		.output = {
			.convolutional = {
				.count = 384,
				.strides = 1,
				.border = 1,
				.rows = 3,
				.cols = 3,
				.channels = 256,
				.partition = 2,
			},
		},
	},
	// fourth layer (convolutional)
	{
		.type = CCV_CONVNET_CONVOLUTIONAL,
		.bias = 1,
		.glorot = 1.41421356237, // sqrtf(2)
		.input = {
			.matrix = {
				.rows = 13,
				.cols = 13,
				.channels = 384,
				.partition = 2,
			},
		},
		.output = {
			.convolutional = {
				.count = 384,
				.strides = 1,
				.border = 1,
				.rows = 3,
				.cols = 3,
				.channels = 384,
				.partition = 2,
			},
		},
	},
	// fifth layer (convolutional => max pool)
	{
		.type = CCV_CONVNET_CONVOLUTIONAL,
		.bias = 1,
		.glorot = 1.41421356237, // sqrtf(2)
		.input = {
			.matrix = {
				.rows = 13,
				.cols = 13,
				.channels = 384,
				.partition = 2,
			},
		},
		.output = {
			.convolutional = {
				.count = 256,
				.strides = 1,
				.border = 1,
				.rows = 3,
				.cols = 3,
				.channels = 384,
				.partition = 2,
			},
		},
	},
	{
		.type = CCV_CONVNET_MAX_POOL,
		.input = {
			.matrix = {
				.rows = 13,
				.cols = 13,
				.channels = 256,
				.partition = 2,
			},
		},
		.output = {
			.pool = {
				.strides = 2,
				.size = 3,
				.border = 0,
			},
		},
	},
	// sixth layer (full connect)
	{
		.type = CCV_CONVNET_FULL_CONNECT,
		.bias = 1,
		.glorot = 1.41421356237, // sqrtf(2)
		.input = {
			.matrix = {
				.rows = 6,
				.cols = 6,
				.channels = 256,
				.partition = 1,
			},
			.node = {
				.count = 6 * 6 * 256,
			},
		},
		.output = {
			.full_connect = {
				.relu = 1,
				.count = 4096,
			},
		},
	},
	// seventh layer (full connect)
	{
		.type = CCV_CONVNET_FULL_CONNECT,
		.bias = 1,
		.glorot = 1.41421356237, // sqrtf(2)
		.input = {
			.matrix = {
				.rows = 4096,
				.cols = 1,
				.channels = 1,
				.partition = 1,
			},
			.node = {
				.count = 4096,
			},
		},
		.output = {
			.full_connect = {
				.relu = 1,
				.count = 4096,
			},
		},
	},
	// eighth layer (full connect)
	{
		.type = CCV_CONVNET_FULL_CONNECT,
		.bias = 0,
		.glorot = 1.41421356237, // sqrtf(2)
		.input = {
			.matrix = {
				.rows = 4096,
				.cols = 1,
				.channels = 1,
				.partition = 1,
			},
			.node = {
				.count = 4096,
			},
		},
		.output = {
			.full_connect = {
				.relu = 0,
				.count = 1000,
			},
		},
	},
};
// Matt Zeiler's Model
ccv_convnet_layer_param_t matt_params[13] = {
	// first layer (convolutional => max pool => rnorm)
	{
		.type = CCV_CONVNET_CONVOLUTIONAL,
		.bias = 0,
		.glorot = 1.41421356237, // sqrtf(2)
		.input = {
			.matrix = {
				.rows = 225,
				.cols = 225,
				.channels = 3,
				.partition = 1,
			},
		},
		.output = {
			.convolutional = {
				.count = 96,
				.strides = 2,
				.border = 1,
				.rows = 7,
				.cols = 7,
				.channels = 3,
				.partition = 2,
			},
		},
	},
	{
		.type = CCV_CONVNET_LOCAL_RESPONSE_NORM,
		.input = {
			.matrix = {
				.rows = 111,
				.cols = 111,
				.channels = 96,
				.partition = 2,
			},
		},
		.output = {
			.rnorm = {
				.size = 5,
				.kappa = 2,
				.alpha = 1e-4,
				.beta = 0.75,
			},
		},
	},
	{
		.type = CCV_CONVNET_MAX_POOL,
		.input = {
			.matrix = {
				.rows = 111,
				.cols = 111,
				.channels = 96,
				.partition = 2,
			},
		},
		.output = {
			.pool = {
				.strides = 2,
				.size = 3,
				.border = 0,
			},
		},
	},
	// second layer (convolutional => max pool => rnorm)
	{
		.type = CCV_CONVNET_CONVOLUTIONAL,
		.bias = 1,
		.glorot = 1.41421356237, // sqrtf(2)
		.input = {
			.matrix = {
				.rows = 55,
				.cols = 55,
				.channels = 96,
				.partition = 2,
			},
		},
		.output = {
			.convolutional = {
				.count = 256,
				.strides = 2,
				.border = 1,
				.rows = 5,
				.cols = 5,
				.channels = 96,
				.partition = 2,
			},
		},
	},
	{
		.type = CCV_CONVNET_LOCAL_RESPONSE_NORM,
		.input = {
			.matrix = {
				.rows = 27,
				.cols = 27,
				.channels = 256,
				.partition = 2,
			},
		},
		.output = {
			.rnorm = {
				.size = 5,
				.kappa = 2,
				.alpha = 1e-4,
				.beta = 0.75,
			},
		},
	},
	{
		.type = CCV_CONVNET_MAX_POOL,
		.input = {
			.matrix = {
				.rows = 27,
				.cols = 27,
				.channels = 256,
				.partition = 2,
			},
		},
		.output = {
			.pool = {
				.strides = 2,
				.size = 3,
				.border = 0,
			},
		},
	},
	// third layer (convolutional)
	{
		.type = CCV_CONVNET_CONVOLUTIONAL,
		.bias = 0,
		.glorot = 1.41421356237, // sqrtf(2)
		.input = {
			.matrix = {
				.rows = 13,
				.cols = 13,
				.channels = 256,
				.partition = 1,
			},
		},
		.output = {
			.convolutional = {
				.count = 384,
				.strides = 1,
				.border = 1,
				.rows = 3,
				.cols = 3,
				.channels = 256,
				.partition = 2,
			},
		},
	},
	// fourth layer (convolutional)
	{
		.type = CCV_CONVNET_CONVOLUTIONAL,
		.bias = 1,
		.glorot = 1.41421356237, // sqrtf(2)
		.input = {
			.matrix = {
				.rows = 13,
				.cols = 13,
				.channels = 384,
				.partition = 2,
			},
		},
		.output = {
			.convolutional = {
				.count = 384,
				.strides = 1,
				.border = 1,
				.rows = 3,
				.cols = 3,
				.channels = 384,
				.partition = 2,
			},
		},
	},
	// fifth layer (convolutional => max pool)
	{
		.type = CCV_CONVNET_CONVOLUTIONAL,
		.bias = 1,
		.glorot = 1.41421356237, // sqrtf(2)
		.input = {
			.matrix = {
				.rows = 13,
				.cols = 13,
				.channels = 384,
				.partition = 2,
			},
		},
		.output = {
			.convolutional = {
				.count = 256,
				.strides = 1,
				.border = 1,
				.rows = 3,
				.cols = 3,
				.channels = 384,
				.partition = 2,
			},
		},
	},
	{
		.type = CCV_CONVNET_MAX_POOL,
		.input = {
			.matrix = {
				.rows = 13,
				.cols = 13,
				.channels = 256,
				.partition = 2,
			},
		},
		.output = {
			.pool = {
				.strides = 2,
				.size = 3,
				.border = 0,
			},
		},
	},
	// sixth layer (full connect)
	{
		.type = CCV_CONVNET_FULL_CONNECT,
		.bias = 1,
		.glorot = 1.41421356237, // sqrtf(2)
		.input = {
			.matrix = {
				.rows = 6,
				.cols = 6,
				.channels = 256,
				.partition = 1,
			},
			.node = {
				.count = 6 * 6 * 256,
			},
		},
		.output = {
			.full_connect = {
				.relu = 1,
				.count = 4096,
			},
		},
	},
	// seventh layer (full connect)
	{
		.type = CCV_CONVNET_FULL_CONNECT,
		.bias = 1,
		.glorot = 1.41421356237, // sqrtf(2)
		.input = {
			.matrix = {
				.rows = 4096,
				.cols = 1,
				.channels = 1,
				.partition = 1,
			},
			.node = {
				.count = 4096,
			},
		},
		.output = {
			.full_connect = {
				.relu = 1,
				.count = 4096,
			},
		},
	},
	// eighth layer (full connect)
	{
		.type = CCV_CONVNET_FULL_CONNECT,
		.bias = 0,
		.glorot = 1.41421356237, // sqrtf(2)
		.input = {
			.matrix = {
				.rows = 4096,
				.cols = 1,
				.channels = 1,
				.partition = 1,
			},
			.node = {
				.count = 4096,
			},
		},
		.output = {
			.full_connect = {
				.relu = 0,
				.count = 1000,
			},
		},
	},
};
// VGG Configuration A Model
ccv_convnet_layer_param_t vgg_a_params[16] = {
	// first layer (convolutional 64 => max pool)
	{
		.type = CCV_CONVNET_CONVOLUTIONAL,
		.bias = 0,
		.glorot = 1.41421356237, // sqrtf(2)
		.input = {
			.matrix = {
				.rows = 225,
				.cols = 225,
				.channels = 3,
				.partition = 1,
			},
		},
		.output = {
			.convolutional = {
				.count = 64,
				.strides = 1,
				.border = 0,
				.rows = 3,
				.cols = 3,
				.channels = 3,
				.partition = 1,
			},
		},
	},
	{
		.type = CCV_CONVNET_MAX_POOL,
		.input = {
			.matrix = {
				.rows = 223,
				.cols = 223,
				.channels = 64,
				.partition = 1,
			},
		},
		.output = {
			.pool = {
				.strides = 2,
				.size = 3,
				.border = 0,
			},
		},
	},
	// second layer (convolutional 128 => max pool)
	{
		.type = CCV_CONVNET_CONVOLUTIONAL,
		.bias = 0,
		.glorot = 1.41421356237, // sqrtf(2)
		.input = {
			.matrix = {
				.rows = 111,
				.cols = 111,
				.channels = 64,
				.partition = 1,
			},
		},
		.output = {
			.convolutional = {
				.count = 128,
				.strides = 1,
				.border = 1,
				.rows = 3,
				.cols = 3,
				.channels = 64,
				.partition = 1,
			},
		},
	},
	{
		.type = CCV_CONVNET_MAX_POOL,
		.input = {
			.matrix = {
				.rows = 111,
				.cols = 111,
				.channels = 128,
				.partition = 1,
			},
		},
		.output = {
			.pool = {
				.strides = 2,
				.size = 3,
				.border = 0,
			},
		},
	},
	// third layer (convolutional 256x2 => max pool)
	{
		.type = CCV_CONVNET_CONVOLUTIONAL,
		.bias = 0,
		.glorot = 1.41421356237, // sqrtf(2)
		.input = {
			.matrix = {
				.rows = 55,
				.cols = 55,
				.channels = 128,
				.partition = 1,
			},
		},
		.output = {
			.convolutional = {
				.count = 256,
				.strides = 1,
				.border = 1,
				.rows = 3,
				.cols = 3,
				.channels = 128,
				.partition = 1,
			},
		},
	},
	{
		.type = CCV_CONVNET_CONVOLUTIONAL,
		.bias = 0,
		.glorot = 1.41421356237, // sqrtf(2)
		.input = {
			.matrix = {
				.rows = 55,
				.cols = 55,
				.channels = 256,
				.partition = 1,
			},
		},
		.output = {
			.convolutional = {
				.count = 256,
				.strides = 1,
				.border = 1,
				.rows = 3,
				.cols = 3,
				.channels = 256,
				.partition = 1,
			},
		},
	},
	{
		.type = CCV_CONVNET_MAX_POOL,
		.input = {
			.matrix = {
				.rows = 55,
				.cols = 55,
				.channels = 256,
				.partition = 1,
			},
		},
		.output = {
			.pool = {
				.strides = 2,
				.size = 3,
				.border = 0,
			},
		},
	},
	// forth layer (convolutional 512x2 => max pool)
	{
		.type = CCV_CONVNET_CONVOLUTIONAL,
		.bias = 0,
		.glorot = 1.41421356237, // sqrtf(2)
		.input = {
			.matrix = {
				.rows = 27,
				.cols = 27,
				.channels = 256,
				.partition = 1,
			},
		},
		.output = {
			.convolutional = {
				.count = 512,
				.strides = 1,
				.border = 1,
				.rows = 3,
				.cols = 3,
				.channels = 256,
				.partition = 1,
			},
		},
	},
	{
		.type = CCV_CONVNET_CONVOLUTIONAL,
		.bias = 0,
		.glorot = 1.41421356237, // sqrtf(2)
		.input = {
			.matrix = {
				.rows = 27,
				.cols = 27,
				.channels = 512,
				.partition = 1,
			},
		},
		.output = {
			.convolutional = {
				.count = 512,
				.strides = 1,
				.border = 1,
				.rows = 3,
				.cols = 3,
				.channels = 512,
				.partition = 1,
			},
		},
	},
	{
		.type = CCV_CONVNET_MAX_POOL,
		.input = {
			.matrix = {
				.rows = 27,
				.cols = 27,
				.channels = 512,
				.partition = 1,
			},
		},
		.output = {
			.pool = {
				.strides = 2,
				.size = 3,
				.border = 0,
			},
		},
	},
	// fifth layer (convolutional 512x2 => max pool)
	{
		.type = CCV_CONVNET_CONVOLUTIONAL,
		.bias = 0,
		.glorot = 1.41421356237, // sqrtf(2)
		.input = {
			.matrix = {
				.rows = 13,
				.cols = 13,
				.channels = 512,
				.partition = 1,
			},
		},
		.output = {
			.convolutional = {
				.count = 512,
				.strides = 1,
				.border = 1,
				.rows = 3,
				.cols = 3,
				.channels = 512,
				.partition = 1,
			},
		},
	},
	{
		.type = CCV_CONVNET_CONVOLUTIONAL,
		.bias = 0,
		.glorot = 1.41421356237, // sqrtf(2)
		.input = {
			.matrix = {
				.rows = 13,
				.cols = 13,
				.channels = 512,
				.partition = 1,
			},
		},
		.output = {
			.convolutional = {
				.count = 512,
				.strides = 1,
				.border = 1,
				.rows = 3,
				.cols = 3,
				.channels = 512,
				.partition = 1,
			},
		},
	},
	{
		.type = CCV_CONVNET_MAX_POOL,
		.input = {
			.matrix = {
				.rows = 13,
				.cols = 13,
				.channels = 512,
				.partition = 1,
			},
		},
		.output = {
			.pool = {
				.strides = 2,
				.size = 3,
				.border = 0,
			},
		},
	},
	// sixth layer (full connect)
	{
		.type = CCV_CONVNET_FULL_CONNECT,
		.bias = 0,
		.glorot = 1.41421356237, // sqrtf(2)
		.input = {
			.matrix = {
				.rows = 6,
				.cols = 6,
				.channels = 512,
				.partition = 1,
			},
			.node = {
				.count = 6 * 6 * 512,
			},
		},
		.output = {
			.full_connect = {
				.relu = 1,
				.count = 4096,
			},
		},
	},
	// seventh layer (full connect)
	{
		.type = CCV_CONVNET_FULL_CONNECT,
		.bias = 0,
		.glorot = 1.41421356237, // sqrtf(2)
		.input = {
			.matrix = {
				.rows = 4096,
				.cols = 1,
				.channels = 1,
				.partition = 1,
			},
			.node = {
				.count = 4096,
			},
		},
		.output = {
			.full_connect = {
				.relu = 1,
				.count = 4096,
			},
		},
	},
	// eighth layer (full connect)
	{
		.type = CCV_CONVNET_FULL_CONNECT,
		.bias = 0,
		.glorot = 1.41421356237, // sqrtf(2)
		.input = {
			.matrix = {
				.rows = 4096,
				.cols = 1,
				.channels = 1,
				.partition = 1,
			},
			.node = {
				.count = 4096,
			},
		},
		.output = {
			.full_connect = {
				.relu = 0,
				.count = 1000,
			},
		},
	},
};
// VGG Configuration D Model
ccv_convnet_layer_param_t vgg_d_params[21] = {
	// first layer (convolutional 64x2 => max pool)
	{
		.type = CCV_CONVNET_CONVOLUTIONAL,
		.bias = 0,
		.glorot = 1.41421356237, // sqrtf(2)
		.input = {
			.matrix = {
				.rows = 225,
				.cols = 225,
				.channels = 3,
				.partition = 1,
			},
		},
		.output = {
			.convolutional = {
				.count = 64,
				.strides = 1,
				.border = 0,
				.rows = 3,
				.cols = 3,
				.channels = 3,
				.partition = 1,
			},
		},
	},
	{
		.type = CCV_CONVNET_CONVOLUTIONAL,
		.bias = 0,
		.glorot = 1.41421356237, // sqrtf(2)
		.input = {
			.matrix = {
				.rows = 223,
				.cols = 223,
				.channels = 64,
				.partition = 1,
			},
		},
		.output = {
			.convolutional = {
				.count = 64,
				.strides = 1,
				.border = 1,
				.rows = 3,
				.cols = 3,
				.channels = 64,
				.partition = 1,
			},
		},
	},
	{
		.type = CCV_CONVNET_MAX_POOL,
		.input = {
			.matrix = {
				.rows = 223,
				.cols = 223,
				.channels = 64,
				.partition = 1,
			},
		},
		.output = {
			.pool = {
				.strides = 2,
				.size = 3,
				.border = 0,
			},
		},
	},
	// second layer (convolutional 128x2 => max pool)
	{
		.type = CCV_CONVNET_CONVOLUTIONAL,
		.bias = 0,
		.glorot = 1.41421356237, // sqrtf(2)
		.input = {
			.matrix = {
				.rows = 111,
				.cols = 111,
				.channels = 64,
				.partition = 1,
			},
		},
		.output = {
			.convolutional = {
				.count = 128,
				.strides = 1,
				.border = 1,
				.rows = 3,
				.cols = 3,
				.channels = 64,
				.partition = 1,
			},
		},
	},
	{
		.type = CCV_CONVNET_CONVOLUTIONAL,
		.bias = 0,
		.glorot = 1.41421356237, // sqrtf(2)
		.input = {
			.matrix = {
				.rows = 111,
				.cols = 111,
				.channels = 128,
				.partition = 1,
			},
		},
		.output = {
			.convolutional = {
				.count = 128,
				.strides = 1,
				.border = 1,
				.rows = 3,
				.cols = 3,
				.channels = 128,
				.partition = 1,
			},
		},
	},
	{
		.type = CCV_CONVNET_MAX_POOL,
		.input = {
			.matrix = {
				.rows = 111,
				.cols = 111,
				.channels = 128,
				.partition = 1,
			},
		},
		.output = {
			.pool = {
				.strides = 2,
				.size = 3,
				.border = 0,
			},
		},
	},
	// third layer (convolutional 256x3 => max pool)
	{
		.type = CCV_CONVNET_CONVOLUTIONAL,
		.bias = 0,
		.glorot = 1.41421356237, // sqrtf(2)
		.input = {
			.matrix = {
				.rows = 55,
				.cols = 55,
				.channels = 128,
				.partition = 1,
			},
		},
		.output = {
			.convolutional = {
				.count = 256,
				.strides = 1,
				.border = 1,
				.rows = 3,
				.cols = 3,
				.channels = 128,
				.partition = 1,
			},
		},
	},
	{
		.type = CCV_CONVNET_CONVOLUTIONAL,
		.bias = 0,
		.glorot = 1.41421356237, // sqrtf(2)
		.input = {
			.matrix = {
				.rows = 55,
				.cols = 55,
				.channels = 256,
				.partition = 1,
			},
		},
		.output = {
			.convolutional = {
				.count = 256,
				.strides = 1,
				.border = 1,
				.rows = 3,
				.cols = 3,
				.channels = 256,
				.partition = 1,
			},
		},
	},
	{
		.type = CCV_CONVNET_CONVOLUTIONAL,
		.bias = 0,
		.glorot = 1.41421356237, // sqrtf(2)
		.input = {
			.matrix = {
				.rows = 55,
				.cols = 55,
				.channels = 256,
				.partition = 1,
			},
		},
		.output = {
			.convolutional = {
				.count = 256,
				.strides = 1,
				.border = 1,
				.rows = 3,
				.cols = 3,
				.channels = 256,
				.partition = 1,
			},
		},
	},
	{
		.type = CCV_CONVNET_MAX_POOL,
		.input = {
			.matrix = {
				.rows = 55,
				.cols = 55,
				.channels = 256,
				.partition = 1,
			},
		},
		.output = {
			.pool = {
				.strides = 2,
				.size = 3,
				.border = 0,
			},
		},
	},
	// forth layer (convolutional 512x3 => max pool)
	{
		.type = CCV_CONVNET_CONVOLUTIONAL,
		.bias = 0,
		.glorot = 1.41421356237, // sqrtf(2)
		.input = {
			.matrix = {
				.rows = 27,
				.cols = 27,
				.channels = 256,
				.partition = 1,
			},
		},
		.output = {
			.convolutional = {
				.count = 512,
				.strides = 1,
				.border = 1,
				.rows = 3,
				.cols = 3,
				.channels = 256,
				.partition = 1,
			},
		},
	},
	{
		.type = CCV_CONVNET_CONVOLUTIONAL,
		.bias = 0,
		.glorot = 1.41421356237, // sqrtf(2)
		.input = {
			.matrix = {
				.rows = 27,
				.cols = 27,
				.channels = 512,
				.partition = 1,
			},
		},
		.output = {
			.convolutional = {
				.count = 512,
				.strides = 1,
				.border = 1,
				.rows = 3,
				.cols = 3,
				.channels = 512,
				.partition = 1,
			},
		},
	},
	{
		.type = CCV_CONVNET_CONVOLUTIONAL,
		.bias = 0,
		.glorot = 1.41421356237, // sqrtf(2)
		.input = {
			.matrix = {
				.rows = 27,
				.cols = 27,
				.channels = 512,
				.partition = 1,
			},
		},
		.output = {
			.convolutional = {
				.count = 512,
				.strides = 1,
				.border = 1,
				.rows = 3,
				.cols = 3,
				.channels = 512,
				.partition = 1,
			},
		},
	},
	{
		.type = CCV_CONVNET_MAX_POOL,
		.input = {
			.matrix = {
				.rows = 27,
				.cols = 27,
				.channels = 512,
				.partition = 1,
			},
		},
		.output = {
			.pool = {
				.strides = 2,
				.size = 3,
				.border = 0,
			},
		},
	},
	// fifth layer (convolutional 512x3 => max pool)
	{
		.type = CCV_CONVNET_CONVOLUTIONAL,
		.bias = 0,
		.glorot = 1.41421356237, // sqrtf(2)
		.input = {
			.matrix = {
				.rows = 13,
				.cols = 13,
				.channels = 512,
				.partition = 1,
			},
		},
		.output = {
			.convolutional = {
				.count = 512,
				.strides = 1,
				.border = 1,
				.rows = 3,
				.cols = 3,
				.channels = 512,
				.partition = 1,
			},
		},
	},
	{
		.type = CCV_CONVNET_CONVOLUTIONAL,
		.bias = 0,
		.glorot = 1.41421356237, // sqrtf(2)
		.input = {
			.matrix = {
				.rows = 13,
				.cols = 13,
				.channels = 512,
				.partition = 1,
			},
		},
		.output = {
			.convolutional = {
				.count = 512,
				.strides = 1,
				.border = 1,
				.rows = 3,
				.cols = 3,
				.channels = 512,
				.partition = 1,
			},
		},
	},
	{
		.type = CCV_CONVNET_CONVOLUTIONAL,
		.bias = 0,
		.glorot = 1.41421356237, // sqrtf(2)
		.input = {
			.matrix = {
				.rows = 13,
				.cols = 13,
				.channels = 512,
				.partition = 1,
			},
		},
		.output = {
			.convolutional = {
				.count = 512,
				.strides = 1,
				.border = 1,
				.rows = 3,
				.cols = 3,
				.channels = 512,
				.partition = 1,
			},
		},
	},
	{
		.type = CCV_CONVNET_MAX_POOL,
		.input = {
			.matrix = {
				.rows = 13,
				.cols = 13,
				.channels = 512,
				.partition = 1,
			},
		},
		.output = {
			.pool = {
				.strides = 2,
				.size = 3,
				.border = 0,
			},
		},
	},
	// sixth layer (full connect)
	{
		.type = CCV_CONVNET_FULL_CONNECT,
		.bias = 0,
		.glorot = 1.41421356237, // sqrtf(2)
		.input = {
			.matrix = {
				.rows = 6,
				.cols = 6,
				.channels = 512,
				.partition = 1,
			},
			.node = {
				.count = 6 * 6 * 512,
			},
		},
		.output = {
			.full_connect = {
				.relu = 1,
				.count = 4096,
			},
		},
	},
	// seventh layer (full connect)
	{
		.type = CCV_CONVNET_FULL_CONNECT,
		.bias = 0,
		.glorot = 1.41421356237, // sqrtf(2)
		.input = {
			.matrix = {
				.rows = 4096,
				.cols = 1,
				.channels = 1,
				.partition = 1,
			},
			.node = {
				.count = 4096,
			},
		},
		.output = {
			.full_connect = {
				.relu = 1,
				.count = 4096,
			},
		},
	},
	// eighth layer (full connect)
	{
		.type = CCV_CONVNET_FULL_CONNECT,
		.bias = 0,
		.glorot = 1.41421356237, // sqrtf(2)
		.input = {
			.matrix = {
				.rows = 4096,
				.cols = 1,
				.channels = 1,
				.partition = 1,
			},
			.node = {
				.count = 4096,
			},
		},
		.output = {
			.full_connect = {
				.relu = 0,
				.count = 1000,
			},
		},
	},
};