본문 바로가기

Enginius/Machine Learning

Convolutional Neural Network (CNN)

딥러닝 시대에 적합한 컨볼루셔널 뉴럴 네트워크입니다. 


매트랩으로 되어있고, 스탠포드 응 교수님의 UFLDL의 CNN을 누군가 풀어놓은 것을 기반으로 만들었습니다. 

(링크: http://deeplearning.stanford.edu/wiki/index.php/UFLDL_Tutorial)


MNIST를 사용하고, 원래는 mean-pooling과 sigmoid를 써서 성능이 97%정도가 나왔는데, max-pooling과 ReLU를 쓰니 98.5%가 나오더군요. 역시 대세인 것에는 이유가 있습니다. 다만 ReLU를 쓸 경우 임의의 weight에 대해서 학습이 안되는 현상이 있어서 rng로 랜덤 시드를 고정하고, Gaussian weight를 줄 때 variance를 약간 수정했습니다. 현재 세팅에서 돌리면 잘 돌아갈 거에요. 


현재 네트워크 구조는 다음과 같습니다. 

cnnConfig.layer{1}.type = 'input';

cnnConfig.layer{1}.dimension = [28 28 1];


cnnConfig.layer{2}.type = 'conv';

cnnConfig.layer{2}.filterDim = [9 9];

cnnConfig.layer{2}.numFilters = 20;

cnnConfig.layer{2}.nonLinearType = 'relu';

cnnConfig.layer{2}.conMatrix = ones(1,20);


cnnConfig.layer{3}.type = 'pool';

cnnConfig.layer{3}.poolDim = [2 2];

cnnConfig.layer{3}.poolType = 'maxpool';


cnnConfig.layer{4}.type = 'stack2line';


cnnConfig.layer{5}.type = 'relu';

cnnConfig.layer{5}.dimension = 360;


cnnConfig.layer{6}.type = 'relu';

cnnConfig.layer{6}.dimension = 60;


cnnConfig.layer{7}.type = 'softmax';

cnnConfig.layer{7}.dimension = 10;


cnnConfig.costFun = 'crossEntropy';

구조는 초창기 LeNet과 같고, 중간에 들어가는 내용이 max-pooling과 ReLU로 바뀐 정도입니다. 


코드를 돌리기 위해선 MNIST를 받아서 압축을 푼 폴더의 '상위 폴더'에 놓아야 합니다. 코드에서 경로를 변경할 수도 있구요. 't10k-images-idx3-ubyte', 't10k-labels-idx1-ubyte', 'train-images-idx3-ubyte', 'train-labels-idx1-ubyte'의 네 파일을 받아야 합니다. 


아래와 같은 것이 콘솔에 나올거에요. 

경과 시간은 163.529524초입니다.

Accuracy is 0.985000


학습된 컨볼루션 필터는 다음과 같이 생겼습니다. 

매트랩 코드


'Enginius > Machine Learning' 카테고리의 다른 글

Hierarchical Occupancy Flow  (0) 2015.12.21
Bayesian Optimization with Expected Improvement  (0) 2015.12.16
Deep Neural Network (DNN)  (1) 2015.12.02
Boosting Methods  (0) 2015.12.02
Practical usage of Representer theorem  (5) 2015.11.07