관리 메뉴

클라이언트/ 서버/ 엔지니어 "게임 개발자"를 향한 매일의 공부일지

딥러닝 13 - 패션 데이터 분류 실습해보기 본문

인공지능/딥러닝

딥러닝 13 - 패션 데이터 분류 실습해보기

huenuri 2024. 9. 22. 22:46

저녁 운동을 하고 나서 청소도 하고 식사도 마치고 나니 벌써 10시가 다 되었다. 그래도 이제부터 저녁 공부를 시작해보려고 한다. 오늘 밤 12시 전까지는 딥러닝 학습을 모두 마치려고 한다.


 

 

 

패션 데이터 분류 실습해 보기

 

 

 

 

 

 

 

 

이렇게 패션에 관련된 사진이 보이고 있다.


 

 

 

 

10개의 클래스에 대한 정보는 다음과 같다.

 

 

 

이제 모델링을 하기 위한 작업을 시작해 본다. 여기서부터는 제공되는 수업이 없어서 그냥 혼자서 코드를 치며 분석을 해보았다.


 

 

 

 

입력 데이터는 28x28 크기의 2D 이미지 데이터로 28x28 크기의 2차원 배열을 1차원으로 변환한다. 이를 통해 선형 형태의 데이터로 학습할 수 있게 만든다. 총 5개의 은닉층이 있으며, 첫 번째 은닉층은 relu 활성화 함수를 사용하고, 나머지 층들은 sigmoid 활성화 함수를 사용하고 있다.

출력층에서는 10개의 유닛을 가지고 있으며, 다중 클래스 분류를 위해 softmax 활성화 함수를 사용한다.

 

학습 설정에서는 SGD를 사용하고 있다. 이 옵티마이저는 확률적 경사 하강법으로, 학습 속도가 느릴 수 있고, 때로는 적절한 학습률을 설정하지 않으면 수렴하지 않을 수 있다.

모델 학습에서 학습 데이터를 80%로 학습하고 20%로 검증한다. 20 epochs 동안 학습을 진행하고, 배치 크기는 64로 설정했다.

 

sigmoid 활성화 함수는 깊은 신경망에서 기울기 소실 문제를 일으킬 수 있다. 이는 sigmoid 함수가 작은 값의 범위에서 출력되고, 역전파 과정에서 기울기가 사라져 학습이 거의 되지 않는 현상이다. 특히 여러 층에 걸쳐 sigmoid 활성화 함수를 사용하면 이 문제가 더 심각해질 수 있다.

이 문제는 relu 함수를 사용하면 해결할 수 있다.


 

 

 

 

 

모델 1과 다른 점 위주로 코드를 해석해 보겠다. 은닉층에서 64, 128, 256, 128, 64개의 유닛을 가진 5개의 층을 구성하며, 모든 은닉층에서 ReLu 활성화 함수를 사용했다. ReLu는 음수 부분을 0으로 만들고, 양수 부분은 그대로 전달하여 비선형성을 유지하는 활성화 함수이다.

출력층에는 softmax를 사용하여 다중 클래스 분류를 처리한다. units=10이므로, 10개의 클래스로 분류한다.

 

앞의 코드와 마찬가지로 SGD를 사용하며, 학습률을 0.001로 설정했다. 기본 SGD의 학습률이 0.01인데, 이는 학습이 제대로 진행되지 않는 경우 학습률을 낮춰서 더 천천히 학습하게 하려는 의도이다.

 

ReLU 활성화 함수는 이러한 기울기 소실 문제를 해결하는 데 효과적이다. ReLU는 음수 값에서 0을 출력하고 양수 값은 그대로 전달하므로, 학습 과정에서 기울기가 소실되지 않는다.

SGD 옵티마이저는 단순하지만 학습 속도가 느릴 수 있다. 학습률(learning rate)을 0.001로 설정한 것은, 학습률이 너무 클 때 학습이 수렴하지 않는 문제를 피하려는 의도이다. 그러나 너무 낮은 학습률은 학습 속도를 지나치게 느리게 할 수 있다. 일반적으로 더 빠른 학습을 위해서는 Adam 옵티마이저를 사용하는 것이 좋다. Adam은 동적으로 학습률을 조정하며, 대부분의 경우에서 더 빠른 수렴을 보이다.

 

학습 데이터에 너무 과적합되면, 검증 데이터에 대한 성능이 떨어질 수 있다. 모델이 학습이 진행됨에 따라 검증 정확도가 떨어진다면 이는 과적합의 신호일 수 있다. 이러한 문제점을 개선해 보자.


 

 

 

 

 

  • 모델 구조 : 모델은 은닉층이 5개로 구성되어 있고, 각 층의 유닛 수가 증가했다가 다시 감소하는 형태로 설계되어 있습니다. 이 구조는 모델이 복잡한 특징을 학습할 수 있게 도와준다.
  • 활성화 함수 : 모든 은닉층에서 ReLU를 사용하여 비선형성을 충분히 반영하고, 기울기 소실 문제를 해결했다.
  • Adam 옵티마이저 : Adam은 학습률을 자동으로 조정하면서 빠르고 안정적인 학습을 제공한다.
  • 검증 데이터 : 학습 데이터의 20%를 검증 데이터로 분리하여, 학습 중에 모델이 학습 데이터에 과적합되는지 확인할 수 있다.

이 모델은 성능도 좋고 나름 괜찮은 모델임을 알 수 있다.


 

 

 


 

 

 

학습을 마치고

수업 영상도 없었지만 혼자서 코드를 읽고 해석해 보았다. 자료를 찾아보면 웬만한 해석은 잘 나와있는 편이라서 요즘처럼 프로그래밍을 공부하기 좋은 환경도 없는 것 같다. 가끔 더 일찍 이 세계에 입문했다면 얼마나 좋았을까 생각할 때가 있는데 아니다 지금이 딱 좋은 시기였다.

이제 마지막 실습이 남아있는데 이것도 수업 영상이 없어 공부를 할지 말지 고민이 된다. 이건 개념 학습이 좀 필요한 내용처럼 보였다. 그냥 나중에 책에 있으면 공부를 하고 이 부분은 넘어가기로 했다.  

 

이로써 딥러닝 기초 수업은 여기서 마치려고 한다. 기본과 심화적인 내용은 책을 통해 더 자세히 배워볼 생각이다. 난 강의보다는 책을 통해서 공부하는 게 훨씬 더 잘 되는 걸 느꼈다.

 

추가 학습 이후

관련 영상이 따로 있어서 시청한 후(10.27) 학습을 진행했다. 딥러닝 공부를 두 권의 책으로 학습한 후라서 그런지 이해력이 많이 좋아졌다. 그리고 이때 작성한 것 중에서 추가로 기록한 건 거의 없었다. 모델을 조합했을 때 어떤 결과가 나오는지 볼 수 있는 예제였다.