본문 바로가기

Programming/Deep Learning

AlexNet을 사용한 Deep Learning 실습(MATLAB) -(2)

프로젝트를 수행하기에 앞서 가장 먼저 할 일은 Dataset을 찾는 것이었다.

6GB 용량의 이미지 모음을 Dataset으로 정하고 프로젝트를 시작했다.

MATLAB에서 명령어를 사용하면
다음과 같이 압축을 풀 수 있다.

압축을 푼 이미지를 이미지 데이터저장소로 불러온다.

imageDatastore 함수는 폴더 이름을 기준으로 이미지에 자동으로 레이블을 지정하고

데이터를 imageDatastore 객체로 저장한다. 이미지 데이터저장소를 사용하면 메모리에 담을 수 없는 데이터를 포함하여 다량의 이미지 데이터를 저장할 수 있고 CNN 훈련 중에 이미지 배치를 효율적으로 가져올 수 있다.

 

이미지를 훈련 데이터 세트와 검증 데이터 세트로 나눈다. 이미지의 70%를 훈련용으로 사용하고

30%를 검증용으로 사용한다. splitEachLabel 함수는 이미지 데이터저장소를 두 개의 데이터저장소로 분할하게 한다.

 

훈련된 이미지를 랜덤하게 16개를 불러와서 출력하도록 한다.

 

사전 훈련된 AlexNet을 불러온다.

 

이론적 배경에서 언급했듯이 이미지 입력 계층에 입력되는 이미지는 크기가 227 x 227 x 3 이어야 한다.

 

사전 훈련된 AlexNet의 마지막 세 계층은 1000개의 클래스에 대하여 구성되어 있다. 이 세 계층을 새로운 학습을 위해 조정해야 한다. 사전 훈련된 AlexNet에서 마지막 3개를 제외한 모든 계층을 추출한다.

 

마지막 세 계층을 Fully connected layer, softmax layer, output layer로 바꾸어 새로운 분류 작업으로 전이한다. Fully connected layer가 새로운 데이터의 클래스 개수와 동일한 크기를 갖도록 설정한다. Fully connected layer에서 WeightLearnRateFactorBiasLearnRateFactor의 값을 높이면 전이된 계층보다 새로운 계층에서 학습이 빠르게 이루어지도록 할 수 있다.

 

네트워크의 입력 이미지는 크기가 227 x 227 x 3이 되어야 하는데 이미지 데이터저장소의 이미지는 이와 다른 크기를 갖는다 따라서 증대 이미지 데이터저장소를 사용하여 훈련 이미지의 크기를 자동으로 조정하도록 한다. 이 때 이미지에 따라 채널이 맞지 않는다는 오류가 발생할 경우가 있다.

 

그럴 때는 이와 같이 ‘ColorPreprocessing’, ‘gray2rgb’ 명령어를 통해 채널을 3(RGB)로 조정하도록 한다.

 

추가적인 데이터 증대를 수행하지 않고 검증 이미지의 크기를 자동으로 조정하려면 이와 같이 증대 이미지 저장소를 추가적인 전처리 연산 지정 없이 사용하면 된다.

 

훈련 옵션을 지정하고 새로 구성한 네트워크를 훈련시킨다.

Batch란 모델을 학습할 때 한 Iteration(반복)당 사용되는 example set이다.

Minibatch는 전체 학습 데이터를 batch size로 나누어 각 batch를 순차적으로 수행하도록 한다.

Verbose MATLAB의 경고 표시 옵션이다.

Epoch 1회는 전체 훈련 데이터 세트에 대하여 하나의 완전한 훈련 주기를 의미한다.

ValidationFrequency에서 설정한 반복횟수에 따라 네트워크가 검증된다.

 

결과

 

처음에는 6GB (약 이미지 5만장)의 파일 모두를 학습시키려고 했으나 시간이 상당히 소요되었기에

Dataset을 조정해야만 했다. 그 결과 5천장에서 6천장의 Dataset이 시간적으로 효율적이라고 생각하였다.

 

5천장의 Dataset을 학습시킨 결과 정확도가 35.44%로 상당히 학습결과가 나빴다.

 

검증 이미지를 분류하여 예측된 레이블과 함께 출력하도록 했다.

 

그 결과 화면인데, 레이블명도 명확하게 설정하지 않아서 무엇을 나타내고자 한 것인지 한 눈에 들어오지 않는다.

또한 직접 확인해 본 결과 예측된 레이블에 해당 이미지가 없었다.

이에 따라 Dataset을 다시 설정해야 한다는 결론에 도달했고, Dataset을 통일된 이미지 모음으로 바꾸기로 결정했다.

 

다시 설정한 Dataset6천장 분량의 개와 고양이 사진이었다.

 

그림과 같이 데이터들을 임의로 불러온 결과 제대로 동작함을 알 수 있다.  

 

다시 데이터를 학습시킨 결과 검증데이터 정확도는 95.17%로 비약적으로 높아졌음을 알 수 있다.

 

결과값에서 알 수 있듯이 제대로 이미지를 인식하고 있음을 알 수 있다 .

 

실습을 진행하며 생긴 개인적인 궁금증 정리

네트워크에서 비선형 함수를 쓰는 이유? - 네트워크 간에 계층을 만들기 위해

numel 명령어 - MATLAB에서 배열 요소의 개수 반환

randperm - MATLAB에서 난수 생성

weight, bias - 가중치와 바이어스, 인공신경망에서 뉴런에 값을 전달하기 위한 요소들

y = wx + b의 꼴로 나타낼 수 있음

Imagedataaugmenter - 이미지 데이터 증대. 데이터 반사, X축, Y축 평행이동을 실시하여

다양한 사이즈의 데이터를 학습가능

sgdm - Stochastic Gradient Descent with Momenum(관성을 사용한 확률적 경사 하강)의 약자.

신경망의 가중치를 조절하는 알고리즘 중에 하나. 손실 함수(Loss Function)을 계산할 때 계산량을 줄이기 위해

mini batch에 대해서만 계산하도록 함. 모멘텀을 사용하면 과거에 이동했던 방식을 기억하며 학습함.

Classify(net, X) - MATLAB에서 사용하는 데이터 분류 함수. 훈련된 네트워크 net을 통하여 X의 이미지 데이터에 대한

클래스 테이블 예측

YPred - 예측 클래스 테이블

Score - 예측 클래스 점수

mean - 배열의 평균값 함수

 

결론

1. AlexNet의 높은 정확도는 CNN을 활용한 Deep Learning 분야가 상당한 발전을 이룰 수 있게 했다.

하지만 높은 정확도를 보장하기 위해선 제대로 된 Dataset 선정이 중요하다는 사실을 알게 되었다.

 

2. 처음에 정확도가 낮게 나온 원인은 Dataset을 기준에 따라서 정했어야 했는데 무작위로 선정하다 보니

엄청나게 다양한 이미지들이 무작위로 섞여 있었다. 그 때문에 정확도가 낮게 나온 것이라 생각한다.

 

3. 6천장보다 더 많은 데이터를 학습시키고 싶었는데, 단일 GPU의 한계 때문이었는지

6천장 이상으로는 시간이 많이 소요되어 학습을 끝까지 시도하지 못한 것이 아쉬웠다.

애초에 AlexNetGPU 두 개를 병렬로 연결하여 결과를 낸 것이라고 하니 하나의 GPU로는 많은 시간이

소요될 것은 당연한 결과일지도 모르겠다.

 

4. 엄청난 수학적 지식들을 필요로 했다. 개인적으로 조금이나마 정리를 해두긴 했지만 아직도 모르는것이

한가득이다.

 

5. MATLAB으로 딥러닝을 진행하는것은 상당히 편리했다. MATLAB 라이브러리 내에서 제공하는 명령어들만

익혀놓는다면 누구나 간단하게 사용가능할 것 같다. 단 유료로 구매해야 한다. 나 같은 경우는 학생 라이센스로

체험판을 사용했다.

유료여서 그런지 몰라도 소스가 별로 없었다... (결론은 무료인 TensorFlow 씁시다.)

 

참고

https://en.wikipedia.org/wiki/Deep_learning

 

Deep learning - Wikipedia

From Wikipedia, the free encyclopedia Jump to navigation Jump to search Branch of machine learning Deep learning (also known as deep structured learning or hierarchical learning) is part of a broader family of machine learning methods based on artificial n

en.wikipedia.org

 

https://kr.mathworks.com/solutions/deep-learning.html?s_tid=hp_brand_deeplearning

 

딥러닝용 MATLAB

MATLAB 코드 몇 줄만으로 딥러닝 모델을 빌드하고 딥러닝 작업을 수행할 수 있습니다.

kr.mathworks.com

https://bskyvision.com/421