Link
11-28 21:34
«   2020/11   »
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          
Archives
Today
1,619
Total
1,176,191
관리 메뉴

꿈 많은 사람의 이야기

파이썬 케라스(keras)로 딥러닝하자! val_loss 향상 이슈 및 정확도 문제(not improve val_loss) 본문

deep learning(딥러닝)

파이썬 케라스(keras)로 딥러닝하자! val_loss 향상 이슈 및 정확도 문제(not improve val_loss)

이수진의 블로그 이수진의 블로그 2018. 6. 21. 13:55


머신러닝과 딥러닝을 혼자서 독학하면서 여러가지 상황에 맞닥드리게 되고 있다.

어찌저찌 해결을 해나가고 있지만, 어제 같은 경우는 도저히 혼자서 해결이 안되었다.

val_loss가 나아지지 않았고, val_acc 즉 정확도가 높아지지 않은 문제가 있었다.

과적합(오버피팅, overfitting) 문제도 아니었다.


케라스에서는 오버피팅을 방지할 수 있다.

Dropout이나 callbacks 라이브러리의 modelcheckpoint, earlystopping을 통해서

overfitting을 방지하기 때문이다.


근데 참 웃긴게 아래와 같은 상황이었다.


나는 데이터 셋을 2개로 나누어서 진행했다.

데이터가 너무 커서 경량화를 하나 추가했다.


예를 들어, 기존 데이터가 1G 짜리라면 경량화는 200MB짜리이다.

데이터 구조는 전부 똑같고, 데이터 개수만 줄인 것이다.

단지. 그 하나의 이유 뿐이었는데

경량화 버전에선 val_loss가 아래와 같이



잘 줄어들었다.

그리거 정확도도 81%정도가 나왔다.



매우 높은 정확도 수치는 아니었다.

그래도 어느 정도는 나왔다.


문제는 경량화에선 괜찮았는데 원본 데이터 셋을 기준으로 진행하면 안된다는 것이었다.

아래와 같이 말이다.



얼마 가지도 못하고 다시 val_loss값이 바로 오르더니

더 이상 상승하지 않았다



도대체 뭐가 문제일까?

난 위에서 Dense의 개수, 그 안에 들어가는 노드의 개수 등을 진짜 할 수 있는 건 다 해봤다.

줄여도 보고 늘려도 보고




하지만 정확도는 언제나 68~69%로 떨어졌다.

오버피팅(overfitting) 방지로 인해 중간에 학습을 그만두게 했으므로 과적합은 방지했다.


그래서 뭐가 문제인지 파악하기 위해 시각적으로 보았다.

matplotlib을 사용해서 시각적으로 봤는데



훈련셋의 accuracy 즉, 정확도 값은 점점 올라가지만,

테스트 셋의 accuracy 값은 점점 떨어졌다.



loss값도 훈련 셋은 점점 낮아졌지만, test셋에선 어느 순간 내려가지 않았다.

즉, not improve val_loss 상태.



마찬가지로 그런 그래프를 보여주었다.

과적합에 대한 그래프가 보이는데, 나는 오버피팅을 방지했단 말이지..

overfitting의 문제가 아무리 생각해도 아니었다.

not improve val_loss 상태를 어떻게 하면 해결할까?


그래서 지인과, 깃헙에 머신러닝&딥러닝을 올리신 고수분들께 죄송하지만 이메일을 날려 자문을 구했다.

다행이도 지인과 고수분들의 답변으로 문제를 해결했다!


케라스(keras)에서 만약 val_loss값이 떨어지지 않거나, 정확도가 올라가지 않을때는 지금 나의 상황으로썬 이렇다.


1. 학습률(learning rate)를 바꾸자.

optimizer를 바꿨다. 기존엔 adam으로 했지만, 이것을 살짝 바꿔주었다.




이와 같이 말이다.


그리고 2번째.


2. 학습 데이터 셋의 부족.


지금 진행한 작업은 텍스트 처리이다.

하나의 파일에 문장이 들어가 있는데, 이게 하나의 데이터 셋이다.



이렇게 충~~분한 데이터 셋을 구해놨다.

한 카테고리당 이러한 파일이 1000개 이상, 9개 카테고리니까 9000개 이상의 데이터가 있는 것이다.

하지만, 문제는 이게 아니었다.

이 파일에 들어가 있는 데이터가 너무~~ 짧다는 것이다.


나는 bag of words 방식으로 진행했다.

즉, 단어에 대한 id 값을 부여하고 그 id 값을 통해 훈련을 진행했다.

근데, 전체 단어 개수는 36600개 정도 되는데 비해 한 파일에 들어가 있는 단어 개수는 30개 정도였다.


30 / 36600   ........

이러니까 안되었던 것이다.




이렇게 파일 한줄의 단어가 30개 많아야 40개 뿐이었다.

나는 이걸 5개의 파일을 하나로 합치는 과정을 진행했다.

즉 30~40개의 단어를 가지고 있는 파일 5개를 1개의 파일로 합쳤다.

그럼 평균적으로 180개 정도가 하나의 파일에 들어가게 된다.



(합친 파일이다...) 너무 길어서 안보여서 그렇지만.


이제 이 상태로 다시 훈련을 진행했다.

그 결과는?!



정확도가 무려 96%로 올라갔다.

어마어마하다.

하.. 너무 힘들었다. 혼자서 하는게 진짜 쉽지가 않네




정확도도 아까보다 훨씬 좋은 그래프를 띄고 있다.



전체적인 것을 봐도 그래프가 훨씬 깔끔해졌고



val_loss값도 정말 깔끔하게 떨어졌다.



훈련과 테스트 셋이 비슷하게 말이다.


이로써 또 하나의 문제를 해결 ㅠㅠ

도움 주신 분들께 감사를 표한다!


9 Comments
댓글쓰기 폼