Convolutional Neural Network (CNN)

Posted 2015.12.03 01:16

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


매트랩으로 되어있고, 스탠포드 응 교수님의 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
Convolutional Neural Network (CNN)  (5) 2015.12.03
Deep Neural Network (DNN)  (1) 2015.12.02
Boosting Methods  (0) 2015.12.02
Practical usage of Representer theorem  (5) 2015.11.07
« PREV : 1 : ··· : 58 : 59 : 60 : 61 : 62 : 63 : 64 : 65 : 66 : ··· : 574 : NEXT »