딥러닝 시대에 적합한 컨볼루셔널 뉴럴 네트워크입니다.
매트랩으로 되어있고, 스탠포드 응 교수님의 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 |