딥러닝 - Tensorflow: 데이터 다루기

dumbbelldore·2025년 1월 12일
0

zero-base 33기

목록 보기
71/97

1. 상황별 데이터 불러오기

1-1. tf.data API 사용

  • 데이터를 효율적으로 처리하고 batch로 제공하기 위한 고수준 API
  • 데이터셋 생성, 변형, batch 처리, shuffle, iterate 등 다양한 기능을 제공함
import tensorflow as tf

# 텍스트 파일에서 데이터 읽기
dataset = tf.data.TextLineDataset("data.txt")
dataset = dataset.map(lambda x: tf.strings.split(x))

# CSV 파일에서 데이터 읽기
dataset = tf.data.experimental.CsvDataset("data.csv", [tf.float32, tf.int32])

# 32개 배치 단위로 분할하기
dataset = dataset.batch(32)

# 데이터 iterate
for data in dataset:
	print(data)

1-2. TensorFlow Datasets(TFDS) 사용

  • 다양한 공용 데이터셋을 손쉽게 다운로드하고 사용할 수 있게 해주는 라이브러리

  • 여러 데이터셋을 미리 전처리하여 제공하므로 즉시 모델 학습에 사용할 수 있다는 장점이 있음

import tensorflow_datasets as tfds

# MNIST 데이터셋 로드
dataset, info = tfds.load('mnist', with_info=True, as_supervised=True)
     
# 학습 데이터와 테스트 데이터 나누기
train_dataset, test_dataset = dataset['train'], dataset['test']

1-3. Numpy 배열을 텐서로 변환

  • Numpy 배열을 텐서로 간편하게 변환하여 사용할 수도 있음
import numpy as np
import tensorflow as tf

# NumPy 배열 생성
data = np.array([[1, 2, 3], [4, 5, 6]])
     
# TensorFlow 텐서로 변환
tensor_data = tf.convert_to_tensor(data)

1-4. 사용자 정의 방식 로딩

  • tf.io.read_file() 함수를 이용하여 바이너리 파일을 읽고 상황에 맞게 변환하는 방법도 제공함
import tensorflow as tf

image_path = 'image.jpg'

image = tf.io.read_file(image_path)
image = tf.image.decode_jpeg(image, channels=3) # 바이너리 파일에 대한 추가적 전처리
image = tf.image.resize(image, [256, 256])

2. tf.data API 파이프라인

  • 데이터를 불러오는 방법 중 tf.data API는 데이터를 효율적으로 처리하고 파이프라인을 구성하는 데 도움이 됨
  • 모델 학습을 효율적으로 진행할 수 있도록 구성하는 일반적인 데이터 파이프라인 흐름은 다음과 같음

2-1. from_tensor_slices()

  • 데이터의 각 항목을 슬라이싱하여 텐서의 형태로 분할
import tensorflow as tf

data = [[1, 2], [3, 4], [5, 6]]
dataset = tf.data.Dataset.from_tensor_slices(data)

for data in dataset:
    print(data)
# tf.Tensor([1 2], shape=(2,), dtype=int32)
# tf.Tensor([3 4], shape=(2,), dtype=int32)
# tf.Tensor([5 6], shape=(2,), dtype=int32)

2-2. map()

  • 필요 시 데이터셋의 각 항목에 함수를 적용하여 변형(정규화, 변환 등)을 수행할 수 있음
dataset = dataset.map(lambda x: x * 2)

for data in dataset:
    print(data)
# tf.Tensor([2 4], shape=(2,), dtype=int32)
# tf.Tensor([6 8], shape=(2,), dtype=int32)
# tf.Tensor([10 12], shape=(2,), dtype=int32)

2-3. batch()

  • 데이터를 지정된 크기(batch size)로 묶어 분할
dataset = dataset.batch(2)

for data in dataset:
    print(data)
# tf.Tensor([[2 4]
#		     [6 8]], shape=(2, 2), dtype=int32)
# tf.Tensor([[10 12]], shape=(1, 2), dtype=int32)  

2-4. shuffle()

  • 모델 학습 전에 데이터의 순서가 랜덤하게 되도록 하여 과적합을 방지하는 데 사용
dataset = dataset.shuffle(buffer_size=1_000)

for data in dataset:
    print(data)
# tf.Tensor([[10 12]], shape=(1, 2), dtype=int32)
# tf.Tensor([[2 4]
#		     [6 8]], shape=(2, 2), dtype=int32)

2-5. prefetch()

  • 다음 데이터셋의 항목을 미리 준비하여 I/O 병목 현상을 줄이는 것이 속도 향상에 도움이 될 수 있음
  • 데이터가 모델에 전달되기 전에 미리 로드되도록 하는 역할을 수행함
dataset = dataset.prefetch(buffer_size=tf.data.experimental.AUTOTUNE)

2-6. repeat()

  • repeat()를 사용하지 않으면 1 epoch 이후 학습이 종료됨
  • 인자 없이 repeat()를 호출하면 데이터셋을 무한히 반복하여 사용할 수 있으며, 내부에 인자를 전달할 경우 해당 인자만큼 사용할 수 있음
dataset = dataset.repeat(2) # 2회 사용 가능

2-7. AUTOTUNE

  • Tensorflow가 데이터 처리 파이프라인에서 자동으로 최적의 값을 찾아 성능을 조정하도록 하는 기능
  • map()prefetch()와 자주 함께 사용됨
dataset = dataset.map(
	lambda x: x * 2,
    num_parallel_calls=tf.data.experimental.AUTOTUNE # 데이터 처리시 병렬 사용 CPU를 자동으로 선정
)

*이 글은 제로베이스 데이터 취업 스쿨의 강의 자료 일부를 발췌하여 작성되었습니다.

profile
데이터 분석, 데이터 사이언스 학습 저장소

0개의 댓글