void test_network()
{
// network의 타입 지정
Network* net = new Network(11);
net->setTypes(0, LAYER_TYPE::CONVOLUTIONAL);
net->setTypes(1, LAYER_TYPE::MAXPOOL);
net->setTypes(2, LAYER_TYPE::CONVOLUTIONAL);
net->setTypes(3, LAYER_TYPE::MAXPOOL);
net->setTypes(4, LAYER_TYPE::CONVOLUTIONAL);
net->setTypes(5, LAYER_TYPE::CONVOLUTIONAL);
net->setTypes(6, LAYER_TYPE::CONVOLUTIONAL);
net->setTypes(7, LAYER_TYPE::MAXPOOL);
net->setTypes(8, LAYER_TYPE::CONNECTED);
net->setTypes(9, LAYER_TYPE::CONNECTED);
net->setTypes(10, LAYER_TYPE::CONNECTED);
// input 이미지 설정
Image* dog = new Image();
dog->loadFromFile("images/test_hinton.jpg");
// 각 레이어별 세팅
int n = 48;
int stride = 4;
int size = 11;
ConvolutionalLayer* cl = new ConvolutionalLayer(dog->getHeight(), dog->getWidth(), dog->getChannel(), n, size, stride);
MaxpoolLayer* ml = new MaxpoolLayer(cl->getOutput()->getHeight(), cl->getOutput()->getWidth(), cl->getOutput()->getChannel(), 2);
n = 128;
size = 5;
stride = 1;
ConvolutionalLayer* cl2 = new ConvolutionalLayer(ml->getOutput()->getHeight(), ml->getOutput()->getWidth(), ml->getOutput()->getChannel(), n, size, stride);
MaxpoolLayer* ml2 = new MaxpoolLayer(cl2->getOutput()->getHeight(), cl2->getOutput()->getWidth(), cl2->getOutput()->getChannel(), 2);
n = 192;
size = 3;
ConvolutionalLayer* cl3 = new ConvolutionalLayer(ml2->getOutput()->getHeight(), ml2->getOutput()->getWidth(), ml2->getOutput()->getChannel(), n, size, stride);
ConvolutionalLayer* cl4 = new ConvolutionalLayer(cl3->getOutput()->getHeight(), cl3->getOutput()->getWidth(), cl3->getOutput()->getChannel(), n, size, stride);
n = 128;
ConvolutionalLayer* cl5 = new ConvolutionalLayer(cl4->getOutput()->getHeight(), cl4->getOutput()->getWidth(), cl4->getOutput()->getChannel(), n, size, stride);
MaxpoolLayer* ml3 = new MaxpoolLayer(cl5->getOutput()->getHeight(), cl5->getOutput()->getWidth(), cl5->getOutput()->getChannel(), 4);
ConnectedLayer* nl = new ConnectedLayer(ml3->getOutput()->getHeight() * ml3->getOutput()->getWidth() * ml3->getOutput()->getChannel(), 4096);
ConnectedLayer* nl2 = new ConnectedLayer(4096, 4096);
ConnectedLayer* nl3 = new ConnectedLayer(4096, 1000);
net->setLayers(0, cl);
net->setLayers(1, ml);
net->setLayers(2, cl2);
net->setLayers(3, ml2);
net->setLayers(4, cl3);
net->setLayers(5, cl4);
net->setLayers(6, cl5);
net->setLayers(7, ml3);
net->setLayers(8, nl);
net->setLayers(9, nl2);
net->setLayers(10, nl3);
// feed-forward 계산
clock_t start = clock(), end;
for (int i = 0; i < 10; ++i) {
net->run(dog);
dog->rotate();
}
end = clock();
printf("Ran %lf second per iteration\n", (double)(end - start) / CLOCKS_PER_SEC / 10);
net->getImage()->showImageLayers("Test Network Layer");
}