티스토리 뷰
3. Convolutional Networks / L2. Convolutional Neural Networks - MLPs for Image Classification, Categorical Cross-Entropy
chrisysl 2018. 9. 4. 13:28MLPs for Image Classification
- 이미지분류를 위해 신경망을 만들어 데이터의 패턴을 분석해보자.
- 신경망을 만든 뒤 학습 된 모델이 새로운 이미지의 숫자를 분류해 낼 것임.
- input으로 받을 벡터의 크기가 784이므로 784개의 노드를 가진 input layer가 필요하다.
- hidden layer는 임의로 512개의 노드를 가진 hidden layer를 2개 연결해주고
- output layer로는 0~9까지의 숫자에 대한 분류가 필요하므로 총 10개의 노드를 생성하여 연결해주자.
- 이제 이렇게 잡은 초안 설계를 Keras에 구현해주어야한다.
- 위의 코드는 이전에 다뤘던 것과 크게 다르진 않지만 추가된 부분이 Flatten layer 이다.
- 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