관리 메뉴

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

케라스 11 - tf.data.Dataset 클래스 본문

인공지능/딥러닝

케라스 11 - tf.data.Dataset 클래스

huenuri 2024. 10. 26. 23:43

이번이 케라스의 마지막이 된다. 마지막까지 힘내서 잘 마무리해 볼 것이다. tf.data.Dataset 클래스(이하 'Dataset 클래스')는 딥러닝 모델의 데이터셋 구축을 보다 편리하고 체계적으로 만들어주는 유틸 클래스다. Dataset 클래스가 제공해 주는 다양한 기능을 활용하여 윈도우, 배치, 셔플 등의 다양한 기능을 손쉽게 구성할 수 있으며 편리하다. 그렇기에 다양한 오픈 소스 예제에서 흔히 볼 수 있다.

하지만 Dataset 클래스 메서드의 기능을 잘 이해하고 있지 않다면, 데이터셋 구성이 의도한대로 구현되지 않기 때문에 세부 기능과 역할에 대하여 미리 숙지하는 것이 바람직하다.


 

 

 

1. as_numpy_iterator

생성된 Dataset 클래스를 넘파이 배열로 반환한다. Dataset 클래스는 모든 요소가 텐서로 출력되지만 넘파이 배열로 변환하면 요소 출력이 가능하다.


 

 

 

2. apply

apply 메서드를 활용하여 사용자가 정의한 변환 함수를 Dataset 클래스에 적용할 수 있다. 다음 예제는 5보다 작은 요소를 반환하는 변환 함수를 apply 적용한 예시다.


 

 

 

3. from_tensor_slices

리스트 혹은 넘파이 배열을 Dataset 클래스로 변환하는 메서드다. Dataset 클래스의 유용한 기능을 사용하기 위해서는 Dataset 클래스로 변환해야 사용 가능하다. 이 메서드를 활용하여 Dataset 클래스로 변환한 후 내장 메서드를 활용하여 데이터셋을 생성할 수 있다. from_tesnor_slices로 변환한 후에는 TensorSliceDataset으로 타입이 변환된다.


 

 

 

4. iteration

Dataset 클래스로 생성한 후 반복문으로 요소들을 출력할 수 있다. 반복문을 통해 접근한 요소는 텐서로 출력된다.


 

 

 

5. range

Dataset 클래스의 range 메서드로 데이터셋의 요소를 생성할 수 있다. 이 메서드는 파이썬의 range 내장함수와 동일하게 동작한다. start, sto, step 순서로 값을 대입하여 범위 요소를 생성할 수 있다.


 

 

 

6. batch

이 메서드는 배치 구성을 한다. 배치 크기를 batch 메서드에 지정하면 배치 크기 만큼의 요소를 하나의 배치로 구성하여 반환한다. 총 8개의 요소를 생성하고 배치 크기를 3개로 구성하면 3개의 요소가 1개의 배치로 구성된 결과를 출력한다.


 

 

 

7. drop_remainder

drop_remainder는 배치 구성 시 잔여 요소의 개수가 배치 크기보다 작다면 생성하지 않는다. 다음 예제는 총 8개의 요소를 생성하고 3개의 배치로 묶는데, 3개의 요소를 2개의 배치로 묶고 난 후 잔여 요소의 개수가 2개인데 출력하지 않고 버려진 것을 확인할 수 있다.


 

 

 

8. window

이 메소드는 시계열 데이터셋 구축 시 윈도우 구현에 사용된다. 윈도우는 윈도우 크기만큼의 데이터를 하나로 묶어서 생성하고자 할 때 사용된다. 예를 들어 5일간의 데이터를 묶어 하나의 배치로 구성하고자 할 때 윈도우 크기를 5로 설정하여 window 메서드에 지정한다. shift는 다음 윈도우 구성의 시작점을 몇 칸씩 건너뛸 것인지 정의한다.

shift = 1로 설정되어 있다면, 1칸씩 건너뛰어 새성된다. drop_remainder = False로 설정되어 있다면 잔여 요소가 배치 크기보다 작더라도 지속 생성한다.

 

딥러닝 모델에 데이터셋 주입시 크기가 일정하게 맞춰있지 않다면 에러가 발생할 수 있으므로, drop_remainder = True로 설정하는 것이 일반적이다.

 

 

shift = 2로 설정하면 다음 윈도우 구성시 2칸씩 건너뛰어 생성하게 된다.


 

 

 

 

9. flat_map

map 함수를 Dataset 클래서에 적용하며 flatten한 결과를 반환한다. flatten한 결과를 반환하기 때문에 map 함수를 적용한 결과가 2차원 배열이라 하더라도 결과는 1차원으로 flatten되어 반환한다. 아래 2가지 예시는 flat_map 메서드를 적용하지 않은 경우와 적용한 경우를 비교한 결과다.

 

 

flat_map 메서드에 batch구성하는 map 함수를 적용하여 배치 구성을 수행할 수 있다.


 

 

 

 

10. shuffle

이 메서드는 데이터셋을 무작위로 섞는다. 다음 예제는 suffle을 적용하지 않은 경우와 적용한 결과를 비교한 예시다.

 

 

shuffle을 적용하지 않으면 데이터가 순차적으로 출력되지만 shuffle을 적용하면 무작위로 섞인 후 결과가 출력된다.


 

 

 

 

 

11. map

map 메서드를 활용하여 map 함수를 Dataset에 적용할 수 있다. map 메서드는 데이터셋을 입력 데이터와 레이블 데이터로 분리할 때 활용한다. map 함수에 lambda 함수를 정의하고 lambda 함수 내부에서 입력 데이터의 범위와 레이블 데이터의 범위를 지정해 반환하는 함수를 적용하면 분리된 결과를 출력한다.

 


 

 

 

학습을 마치고

드디어 케라스 학습을 모두 마쳤다. 절반 정도는 전날 너무 졸려서 다 하지 못하고 다음날 새벽 5시에 일어나서 진행해 보았다. 평소보다 2시간이나 늦게 일어났지만 늦게 취침을 했기 때문이었다.

이로써 케라스에 대해 어느 정도 이해했고 딥러닝 공부도 좀더 재미있어졌다. GPU도 100개나 구입했으니 이제 딥러닝 연산도 마음껏 할 수 있는 환경도 갖추어졌다. 다음 포스트부터는 조금 더 재미있고 내가 관심이 있는 이미지 관련 학습을 시작해 볼 것이다.