본문 바로가기

Data-science/deep learning

[error handling] python generator, fit_generator를 썼을 때 loss가 변하지 않고 학습이 되지 않을 때, 시계열 데이터 학습 실수

728x90

제너레이터 구현과 상관없이 시계열 데이터의 학습 방법을 잘 몰라서 발생한 실수였다.

윈도우 사이즈가 10인경우

t ~ t+10, t+1 ~ t+11, t+2 ~ t+12 ... 이런식으로 데이터가 구성되고

가령,

<학습 데이터의 경우>

t ~ t+10, t+2 ~ t+12, t+5 ~ t+15, ...

<검증 데이터의 경우>

t+1 ~ t+11, t+3 ~ t+13, t+4 ~ t+14, ...

이런식으로 구성된다.

 

그런데 내가 구성한 방식은... 이런 시계열 순서를 무시하고 train/test를 먼저 분리한 후

t~t+10, t+1~t+11 ... 은 train으로

t+20~t+30, t+21~t+31 ... 은 test로 해서

겹치는 데이터가 없어진다. 즉 1초대 부터 10초대까지의 데이터는 3초대부터 13초대까지의 데이터와 겹치게 마련이고 그게 train/val에 나눠 들어간다.

그런데 먼저부터 1초 부터 30초 구간까지는 학습, 31초 부터 50초까지는 테스트로 두면 겹쳐지는 데이터가 없어진다. 그래서 학습이 안됐던 것이다!!!

 

장황하게 설명했지만 해결책은 간단했다.

 

나눠진 데이터 자체를 입력값으로 받는게 아닌, 전체 데이터와 나눌 인덱스를 추가적인 입력값으로 받아서 제너레이터를 구성했다. 이럴 경우 전체 데이터에서 계산하므로 겹치는 부분까지 모두 데이터에 포함될 수 있어 앞서 문제가 해결된다.

이를 활용하는 코드는 아래에 있다.

주석 처리한 부분은 개별 덩어리를 나눈 후 학습했던 실수 부분