tf.data.Dataset

tensorflow에서 지원하는 Dataset를 관리하는 모듈입니다.

 

Training시에 data를 쉽게 처리하기위해 제공되는 모듈로서 MNIST를 활용하여 실습해보겠습니다.

1. MNIST 불러오기

 import tensorflow as tf

mnist = tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()

 

우선 tf.keras.datasets.mnist를 통해 mnist를 불러오겠습니다.

2. from_tensor_slices 사용하기

 ds_train = tf.data.Dataset.from_tensor_slices(
    (x_train, y_train)
).shuffle(10000).batch(10)

 

불러온 데이터를 tf.data.Datset의 method인 from_tensor_slices( )를 통해 tensor를 생성합니다.

 

 

[참조] https://www.tensorflow.org/guide/data#consuming_numpy_arrays

 

Tensorflow.org에 따르면 큰 크기의 feature일 경우 tf.constant( )의 사용으로 여러번 array가 복사되어,

 

메모리의 낭비가 발생한다고하니 주의가 필요합니다.

 

shuffle( )은 입력된 buffer_size만큼 data를 채우고 무작위로 sampling하여 새로운 data로 바꿉니다.

 

완벽한 셔플링을 위해서는 데이터 세트의 전체 크기보다 크거나 같은 버퍼 크기가 필요합니다.

 

만약 작은 데이터수보다 작은 buffer_size를 사용할경우,

 

처음에 설정된 buffer_size만큼의 data안에서 임의의 셔플링이 발생합니다.

 

batch( )를 통해 원하는 batch size를 결정하게 됩니다.

3. batch 불러오기

images = []; labels = []
for image, label in ds_train:
    images = image; labels = label
    break

images, labels = images.numpy(), labels.numpy()

 

tensorflow 2.0 에서는 for 문을 통해 batch_dataset에 접근할 수 있습니다.

 

또한, tensorflow 2.0 에서는 eager모드가 기본으로 적용돼 있습니다.

 

따라서, tensorflow를 numpy로 변경하기위해서 session을 불러오는 작업이 numpy( )로 간단히 대체되었습니다.

4. batch 출력

def batch_out(data):
    for image, label in data:
        return image.numpy(), label.numpy()

 

우선 간단히 batch 1개를 return하는 함수를 작성하여 batch를 불러오도록 하겠습니다.

 

images, labels = batch_out(ds_train)
fig1 = plt.figure(num='first batch')
for i in range(10):
    subplot = fig1.add_subplot(2, 5, i + 1)
    subplot.axis('off')
    subplot.imshow(images[i], cmap='gray')

images, labels = batch_out(ds_train)
fig2 = plt.figure(num='second batch')
for i in range(10):
    subplot = fig2.add_subplot(2, 5, i + 1)
    subplot.axis('off')
    subplot.imshow(images[i], cmap='gray')

plt.show()

 

batch를 불러온후 각 batch를 출력해보았습니다.

 

 

 

각 batch가 다르게나오는것을 확인할 수 있습니다.

+ Recent posts