딥러닝(텐서플로우)

윈도우 기법

Dean83 2023. 4. 6. 16:02

데이터의 전체를 모두 인풋으로 학습하는것이 아니라, 일부 구간은 학습으로 사용하고, 일부 구간은 해당 학습의 예측 데이터로 활용하는 방법이다. 시간 순서 혹은 정렬된 데이터의 미래예측 뿐 아니라 다양한 분야에서 사용된다. 

 

학습시 인풋으로 데이터 전부를 전달하는것이 아닌, 일부 구간만 잘라서 학습 데이터로 사용하고,
그 다음 부터 일부 구간은 예측 결과로 사용한다. 

 

다시말해, 앞구간의 데이터를 통해 학습한 예측 결과로 그 다음 구간의 데이터를 활용한다.


예를들어 1,2,3,4,5,6,7,8,9,10 의 데이터가 있다고 한다면, 

1,2,3,4,5 가 첫번째 윈도우가 되고, 6,7,8,9,10 이 다음 윈도우가 된다. 

앞의 윈도우는 학습데이터로 사용하고, 뒤의 윈도우는 예측 데이터로 사용한다. 

 

시간 기준으로 나열된 데이터로 예를 들자면, 시작점에서 2시간 후 발생한 데이터를 학습에 사용하고, 2시간 후 ~ 4시간 데이터를 예측데이터로 사용을 하는 것이다. 

 

그 다음 스텝에서는 1시간 ~ 3시간 데이터가 학습데이터가 되고, 3 시간 ~ 5시간이 예측 데이터가 된다. 

 

데이터를 읽어 오는 부분에서, 다음의 동작이 되도록 코딩을 해야 한다. 

A , A1, A2 ......

B, B1, B2, ......

C, C1, C2, ......

D, D1, D2, ......

E, E1, E2, .......

 

의 데이터가 있을 경우,  이 데이터를 모두 배열에 담으면, {[A, A1, A2 .....] , [B, B1,......],....} 으로 담기게 될 것이다. 

이 전체 데이터에서, 윈도우 크기만큼 잘라내어 X로, 그 이후 크기만큼 잘라내여 Y로 데이터를 분할하여야 한다. 

 

1. 윈도우 기법의 구현

1.1 keras,layers.Bidirectional 및 keras.layers.LSTM의 조합

for i in range(len(데이터 전체배열) - window크기 * 2):
	X.append(데이터전체배열[i:i+윈도우크기])
	Y.append(데이터전체배열[i+윈도우크기]:i+윈도우크기 * 2)

설명을 하자면, 

- 데이터 전체 배열에서 X, Y 윈도우 2개를 만들어야 하므로 윈도우 크기의 두배를 뺀 만큼 반복해야 한다. 

- X 는 0번부터 윈도우 크기만큼 잘라내고, Y는 윈도우 크기부터 윈도우 크기*2 만큼 잘라내어 누적하여 append 한다. 

 

이렇게 추출한 데이터를 가지고 keras.layers.Bidirectional(keras.layers.LSTM(신경망 갯수, return_sequences=True)) 를 통해 학습을 시킨다. 

 

return_sequences=True를 할 경우, 각 시퀀스마다 출력 결과를 내놓는다. 각각의 시퀀스의 결과를 이용하여 다른 레이어의 인풋값으로 전달 함으로서 성능을 높힌다. 

 

1.2 tensor.window 함수

위에서는 데이터에서 임의로 윈도우 사이즈 만큼 데이터를 수동으로 잘라내었다. 

tensor.window 함수를 이용하면, 이를 함수호출을 통해 해결하고, 인자값을 통해 다양하게 구성할 수 있다.

 

일단 불러온 데이터를 tensor 형식으로 변환해야 한다. 

- tensor 변수명 = tensorflow.data.from_tensor_slices(데이터변수) : Numpy 배열을 Tensor 로변환

- tensor변수명 = tensor변수명.window(.....)
    - 인자값 설명
        - size= 정수 : 윈도우 사이즈

        - stride = 정수 : 한 윈도우 내 데이터간 간격이다. size가 1일때는 소용이 없다. size가 2 이상이고, 
                                  이 값이 2 이상일 경우에는, 한 윈도우를 만들때 데이터를 건너뛰고 만들게 된다. 
                                  예) A, B, C, D... 가 있고, size가 2, stride 가 2일 경우 1번째 X 윈도우는 A,C 가 된다.

        - shift = 정수 : 윈도우간 간격을 의미한다. 첫번째 윈도우와 두번째 윈도우의 간격이다. 

        - drop_remainder = bool값 : size 만큼 데이터를 자르는데, 끝에 남은 데이터는 개수가 안맞을 수 있다.
          (예 : 데이터가 9개인데 size가 2 이면 마지막은 1만 남는다) 이 데이터를 drop 할지 여부이며, true로 

          설정 해야 한다. 

- tensor 변수명 = tensor변수명.flat_map(lambda x : x.batch(윈도우 크기)) : tensor의 차원을 줄여준다. flatten 같은것. 
                                                                                                                        윈도우 크기는 위에 size에 해당한다.

 

위의 함수를 통해 각 X, Y 데이터를 생성하고, 이를 이용하여 layers 의 각 X, Y 인자값으로 넣고 학습 시킨다.