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를 생성합니다.
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가 다르게나오는것을 확인할 수 있습니다.