개발일기

AI - tensorflow 전처리 함수를 활용한 연산 최적화 본문

AI/Deep Learning - Machine Learning

AI - tensorflow 전처리 함수를 활용한 연산 최적화

Flashback 2025. 1. 1. 18:43
728x90
반응형

 

데이터를 모델에 주입하기 전에 데이터를 가공하는 데이터 전처리 단계를 거쳐야 한다. 전처리를 통해 입력 데이터를 효율적으로 처리할 수 있게 할 수 있다. 데이터 전처리가 이뤄지지 않으면 학습 성능이 저하되거나 학습 도중에 문제가 발생할 수 있다. tensorflow에서는 map, shuffle, batch, cache, prefetch와 같은 데이터 전처리에 필요한 함수를 제공한다. 또한 연산이 효율적으로 처리될 수 있게 최적화 기능을 지원한다.

 

1. 전처리 함수

  • map(): 데이터셋의 각 요소에 사용자 정의 함수를 적용하는데 사용된다. 예를 들어 입력 데이터를 정규화하는 사용자 함수를 정의하여 map() 메서드에서 사용할 수 있다.
    • num_parallel_calls: 이 옵션에 AUTOTUNE을 적용하여 병렬연산 처리를 자동으로 최적화되게 할 수 있다. AUTOTUNE을 적용하지 않으면 데이터를 훈련하기까지의 과정이 순차적으로 처리된다. 순차적으로 처리되면 시간이 오래 걸린다는 단점이 존재한다. 이를 개선하기 위해 AUTOTUNE을 적용하여 병렬로 처리하게 하면 훨씬 짧은 시간에 처리할 수 있다.

Sequential Map
Parallel Map

 

이미지에서 볼 수 있듯이 병렬로 처리하면 처리 시간이 감소하는 것을 확인할 수 있다.

  • shuffle(buffer_size): 데이터 순서를 랜덤하게 섞어 모델이 데이터 순서에 의존하지 않도록 하는 메서드이다. 몇개 단위로 섞을지 지정할 수 있다. 매개 변수에 수를 입력하면 해당 수만큼의 데이터를 가져와 섞기를 진행한다. 만약 buffer_size를 1000으로 지정하면 1000개 단위로 데이터를 가져와 섞기를 진행한다.
  • batch(batch_size): 지정된 batch_size만큼 데이터를 하나의 batch로 묶어주는 역할을 한다. shuffle(1000)과 같이 사용한다면 랜덤하게 섞인 1000개의 데이터에서 64개의 데이터를 랜덤하게 추출하여 하나의 배치로 구성한다.
  • cache(): 데이터셋을 메모리에 저장하거나 로컬 스토리지에 저장하여 데이터를 캐싱한다. 캐시오딘 데이터는 각 epoch마다 데이터를 가져오거나 파일을 여는 등의 과정을 단축시키는 역할을 한다.
  • prefetch(): 훈련이 진행될 때, 다음에 입력할 데이터를 가져와 미리 전처리를 진행하도록 시스템을 조율하는 역할을 한다. 일반적으로 AUTOTUNE과 같이 사용하며 병렬 처리를 통해 학습 시간을 감소시킨다.

2. map 사용법

mnist 데이터셋에 preprocess_image라는 함수를 사용자 정의 함수를 적용하여 map함수를 통해 간단하게 정규화를 진행할 수 있다.

# 전처리 함수를 활용한 데이터 전처리
def preprocess_image(image, label):
    image = tf.cast(image, tf.float32) / 255. # 데이터 정규화
    image = tf.expand_dims(image, axis=-1) # 채널 추가
    return image, label

train_data = train_data.map(preprocess_image, num_parallel_calls=tf.data.AUTOTUNE)
valid_data = valid_data.map(preprocess_image, num_parallel_calls=tf.data.ATUOTUNE)
# train_data, valid_data 데이터 정규화 진행

tensorflow는 연산을 할 때, float32 숫자 값을 사용하기 때문에 cast함수를 통해 float32으로 변환한 후 정규화를 진행한다.

 

3. shuffle, batch, cache, prefetch 사용법

BATCH_SIZE =64
BUFFER_SIZE = 1000

train_data = train_data.shuffle(BUFFER_SIZE).batch(BATCH_SIZE).prefetch(tf.data.AUTOTUNE)
valid_data = valid_data.batch(BATCH_SIZE).cache().prefetch(tf.data.AUTOTUNE)
  • train_data: 학습에 사용하는 데이터이기 때문에 shuffle을 통해 랜덤성을 부여한다. 그 후 순서대로 batch(), prefetch() 를 나열하여 사용한다.
  • valid_data: 검증에 사용하는 데이터이기 때문에 shuffle의 필요성이 없기 때문에 사용하지 않는다. 그 후 순서대로 batch(), cache(), prefetch() 를 나열하여 사용한다.

참고 사이트:

https://velog.io/@dust_potato/tensorflow2-data-pipeline-multi-threading-using-.map-function

 

tensorflow2 딥러닝 모델에서 효율적인 입력 파이프라인 만들기

tensorflow2 multi threading을 사용해서 효율적인 data pipeline을 구축하자!

velog.io

 

https://www.tensorflow.org/guide/data_performance

 

tf.data API로 성능 향상하기  |  TensorFlow Core

tf.data API로 성능 향상하기 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 개요 GPU와 TPU는 하나의 학습 단계를 실행하는데 필요한 시간을 급격하게 줄일 수

www.tensorflow.org

 

https://stackoverflow.com/questions/53514495/what-does-batch-repeat-and-shuffle-do-with-tensorflow-dataset

 

What does batch, repeat, and shuffle do with TensorFlow Dataset?

I'm currently learning TensorFlow but I came across a confusion in the below code snippet: dataset = dataset.shuffle(buffer_size = 10 * batch_size) dataset = dataset.repeat(num_epochs).batch(batch...

stackoverflow.com

728x90
반응형
Comments