티스토리 뷰

MLPs for Image Classification

 - 이미지분류를 위해 신경망을 만들어 데이터의 패턴을 분석해보자.

 - 신경망을 만든 뒤 학습 된 모델이 새로운 이미지의 숫자를 분류해 낼 것임.




 - input으로 받을 벡터의 크기가 784이므로 784개의 노드를 가진 input layer가 필요하다.

 - hidden layer는 임의로 512개의 노드를 가진 hidden layer를 2개 연결해주고

 - output layer로는 0~9까지의 숫자에 대한 분류가 필요하므로 총 10개의 노드를 생성하여 연결해주자.

 - 이제 이렇게 잡은 초안 설계를 Keras에 구현해주어야한다.




 - 위의 코드는 이전에 다뤘던 것과 크게 다르진 않지만 추가된 부분이 Flatten layer 이다.

 - Flatten layer는 이미지를 행렬로 표현했을 때 각 요소당 값을 벡터로 변환해주는 역할을 한다.

 - Keras의 Flatten layer에 대한 설명




 - 모델의 summary에서 Flatten 이후에 784개의 벡터를 리턴하는것을 확인할 수 있다.

 - 이제 모델을 더 구체화 해야한다.




 - 모든 hidden layer에 ReLU activation function을 적용해주도록 하자.

 - 이 함수는 양의 값은 그대로, 음의값은 0으로 모두 만들어 줬었던것을 이미 다뤘었다.

 - 이전에 다뤘을 때 ReLU 함수가 "vanishing gradients"과 같은 문제를 해결하는 데 효과적임을 언급했었다.

 - ReLU 함수를 적용시키므로써 정확도가 크게 향상되게 된다.

 - 이 함수는 CNN에서 정말 광범위 하게 사용되므로 꼭 알고있어야 한다.




 - 이 모델을 학습시켜보면 over-fitting 된다는 것을 인지하게 될 것인데, 

 - 모델이 숫자에 대한 예측이나 데이터셋을 학습하는데에 있어 훌륭하지만

 - 이미지를 테스트할 때 별로 좋지 않은것을 확인할 수 있다.

 - 이 over-fitting 현상을 줄이고자 직전에 배운 dropout 레이어를 두게된다.




 - dropout 레이어는 반드시 0 부터 1 사이의 값을 인자로 넘겨줘야 한다.

 - 이 dropout 값이 학습을 진행할 때 모든 노드에 대해 동일하게 적용되게 된다.




 - 학습을 시키는 첫 단계에선 이 dropout값을 작은값(위의 예시에선 0.2)으로 시작하길 권장한다.

 - 그 이후 몇차례의 시도를 진행하며 서서히 값을 올려나가는 식이다.






Categorical Cross-Entropy

 - 위에서 확인해보면 데이터들을 적절하게 나열했고 모델도 구체적으로 세부화되었다.

 - 600,000개 이상의 가중치는 랜덤하게 설정되었고 따라서 설계한 모델은 랜덤한 prediction을 가지게 된다.

 - 모델을 학습시키며 이 60만개의 가중치를 수정해나가고 prediction을 정확하게 개선해나갈것이다.

 - 그런데 모델을 학습시키기 이전에 loss function에 대해 구체적으로 정의해줘야 한다.

 - multiclass classifier를 설계하고있으므로, categorical cross-entropy loss를 사용하도록 하자.

 - 이 categorical cross-entropy loss 함수는 모델이 리턴한 예측값(prediction)과 실제 label을 비교하여

 - 이 모델이 이미지를 잘 분류하고 있는지를 판단한다.




- categorical cross-entropy loss function의 역할을 살펴보면

 - 위의 3이라는 이미지에 대해 모델이 초기 학습과정에서 

 - 이 이미지가 3일 확률을 0.1, 8일확률을 0.9로 예측한 경우, label과 비교하여 다르기때문에

 - 2.30이라는 비교적 큰 loss 값을 리턴한다.

 - 반대로 학습의 마지막즈음 3일 확률을 0.9, 8일 확률을 0.1로 예측한 경우

 - label과 일치하므로 0.105라는 비교적 작은 loss 값을 리턴한다.




- 다시말해, 모델이 예측한 prediction 값과 실제 데이터의 label값이 일치한다면 낮은 손실값(lower loss)을 리턴하고

 - 다르다면 높은 손실값(higher loss)을 리턴하게된다.

 - 따라서 모델이 낮은 loss값을 리턴해야 모델의 prediction이 정확한 것이므로

 - 낮은 loss값을 리턴하도록 모델의 인자값들을 변경 및 수정하는 과정을 거치게 된다.




- 앞선 과정에서 loss function에 대해 다룰때 이를 산을 하강하는것에 비유했었다.

 - 그리고 에러를 최소화 하는것은 산의 최저점까지 하강하는 방법을 찾는것이었다.

 - loss function으로부터 하강하는데에 가장 일반적인 방법은 gradient descent 이다.




- 위 그림은 loss function에 대한 시각화된 이미지인데, 

 - 하강을 나타내는 각 선들(SGD, Momentum, ..)은 각기 다른 optimizer을 그려낸 것이다.

 - 물론 위의 모든 optimizer들은 loss function의 최저값을 향해 가지만

 - 각각 하강의 전개양상이 다르다.

 - 앞으로의 내용에서는 optimizer로 RMSProp를 사용 할 것이지만, 위의 optimizer를 모두 확인해보는것이

 - 여러모로 실력 향상에 도움이 될 것임.




- 함수를 컴파일할 때 loss function과 optimizer를 명시해줘야만 한다.

 - 위와같이 metrics의 인자로 accuracy를 주게되면, 모델의 학습 과정에있어 정확도가 어떻게 변화하는지를 확인할 수 있다.




- 모델을 컴파일하고 나면, 테스트셋을 학습하기 전의 정확도가 어느정도인지를 확인할 수 있다.

 - 학습 이전에 정확도는 1/10 또는 10%정도의 정확도임을 확인할 수 있다.

 - 이제 이 정확도를 학습시켜 향상시키면 된다.




** 참고

 - Keras의 연결된 레이어에 대해 자세한 설명은 여기

 - Dense 레이어에 대한 설명을 참고하면 될듯

 - kernal_initializer 및 bias_initializer 매개변수값을 줘서 가중치가 초기화되는 방식을 변경할 수 있음.

 - 디폴트값은 'glorot_uniform' 과 'zeros' 임.

 - 각각의 이니셜라이저가 Keras상에서 어떻게 작동하는지 위의 링크에서 확인가능.

 - 또한 Keras엔 여러가지 loss function들이 존재하는데, 앞으로 다룰땐

 - categorical_crossentropy 만을 사용할 예정이다.

 - Keras의 여러 optimizer를 확인하려면 아래 참고

  · 'sgd' : SGD

  · 'rmsprop' : RMSprop

  · 'adagrad' : Adagrad

  · 'adadelta' : Adadelta

  · 'adam' : Adam

  · 'adamax' : Adamax

  · 'nadam' : Nadam

  · 'tfoptimizer' : TFOptimizer

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함