Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
Tags
- phpredis
- nginx
- webpack
- docker
- Node
- fastapi
- Redis
- For
- Machine Learning
- AWS
- mariadb
- deep learning
- SQL
- Backbone.js
- php
- Babel
- 기초 수학
- NCP
- Go
- Switch
- rabbitmq
- CentOS
- nodejs
- Redux
- React
- 블레이드 템플릿
- linux
- javascript
- python
- laravel
Archives
- Today
- Total
개발일기
AI - tensorflow 전처리 함수를 활용한 연산 최적화 본문
728x90
반응형
데이터를 모델에 주입하기 전에 데이터를 가공하는 데이터 전처리 단계를 거쳐야 한다. 전처리를 통해 입력 데이터를 효율적으로 처리할 수 있게 할 수 있다. 데이터 전처리가 이뤄지지 않으면 학습 성능이 저하되거나 학습 도중에 문제가 발생할 수 있다. tensorflow에서는 map, shuffle, batch, cache, prefetch와 같은 데이터 전처리에 필요한 함수를 제공한다. 또한 연산이 효율적으로 처리될 수 있게 최적화 기능을 지원한다.
1. 전처리 함수
- map(): 데이터셋의 각 요소에 사용자 정의 함수를 적용하는데 사용된다. 예를 들어 입력 데이터를 정규화하는 사용자 함수를 정의하여 map() 메서드에서 사용할 수 있다.
- num_parallel_calls: 이 옵션에 AUTOTUNE을 적용하여 병렬연산 처리를 자동으로 최적화되게 할 수 있다. AUTOTUNE을 적용하지 않으면 데이터를 훈련하기까지의 과정이 순차적으로 처리된다. 순차적으로 처리되면 시간이 오래 걸린다는 단점이 존재한다. 이를 개선하기 위해 AUTOTUNE을 적용하여 병렬로 처리하게 하면 훨씬 짧은 시간에 처리할 수 있다.
이미지에서 볼 수 있듯이 병렬로 처리하면 처리 시간이 감소하는 것을 확인할 수 있다.
- 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
https://www.tensorflow.org/guide/data_performance
728x90
반응형
'AI > Deep Learning - Machine Learning' 카테고리의 다른 글
AI - Dropout을 통한 과대적합 방지 (0) | 2025.01.01 |
---|---|
딥러닝 - 합성곱 신경망을 이용한 mnist 데이터 예측 모델 (0) | 2024.12.29 |
딥러닝 - 합성곱 신경망(CNN) (0) | 2024.12.27 |
머신 러닝 - California Housing Price Prediction(Regression) (0) | 2024.08.18 |
머신 러닝 - IQR 이상치(Outliers) 제거 (0) | 2024.08.17 |
Comments