티스토리 친구하기

본문 바로가기

딥러닝/Your own dataset

mnist your own dataset - tensorflow.data.Dataset 3

728x90

Update

2019.8.13: Posting

 

import tensorflow as tf
import numpy as np

from glob import glob
from PIL import Image

### 사용할 함수 정의 ###
def get_label_from_path(DATA_LIST):
	label_list = []
	for path in DATA_LIST:
		label = path.split('/')[-2]
		label_list.append(label)
	return label_list

def _read_py_function(DATA_PATH_LIST, LABEL_LIST):
	image = np.array(Image.open(path))
	image.reshape(image.shape[0], image.shape[1], 1)
	LABEL_LIST = np.array(LABEL_LIST, dtype=np.uint8)
	return image.astype(np.int32), LABEL_LIST

def data_slice_and_batch(path_list, labels, bufferSize, batch_size):
	dataset = tf.data.Dataset.from_tensor_slices((path_list, labels))
	dataset = dataset.map(lambda path_list, labels:
		tuple(tf.py_func(_read_py_function, [path_list, labels],
			[tf.int32, tf.uint8])))
	
	dataset = dataset.shuffle(buffer_size=(bufferSize))
	dataset = dataset.repeat()
	dataset = dataset.batch(batch_size)

	return dataset
    
batch_size = 500
shuffle_buffer_size = 100000

DATA_PATH_LIST = glob('./mnist_png/training/*/*.png')
LABELS = get_label_from_path(DATA_PATH_LIST)
dataset = data_slice_and_batch(DATA_PATH_LIST, LABELS, shuffle_buffer_size, batch_size)

init = tf.global_variables_initializer()
iterator = dataset.make_initializable_iterator()

with tf.Session() as sess:
	sess.run(init, iterator)
	image, label = sess.run(iterator.get_next())

 

중요한 함수에 대한 설명은 모두 끝났다. 이제부터는 각 함수의 기능들을 알고 있다고 가정하고 전체 코드가 어떻게 돌아가는지 하나씩 살펴볼 것이다.

 

import tensorflow as tf
import numpy as np

from glob import glob
from PIL import Image

 

딥러닝 알고리즘을 코딩하기 위해 필요한 프레임워크 및 모듈을 import한다.

  • tensorflow 프레임워크를 tf라는 이름으로 import
  • numpy를 np라는 이름으로 import
  • mnist 파일의 경로를 불러오기 우해 glob 모듈에서 glob를 import
  • mnist 이미지를 불러오기 위해 PIL 모듈에서 Image를 import
def get_label_from_path(DATA_PATH_LIST):
def data_list2data(DATA_PATH_LIST, LABEL_LIST):
def data_slice_and_batch(DATA_PATH_LIST, LABEL_LIST, ShuffleBufferSize, batch_size):

 

"get_label_from_path" 함수

  • 입력: DATA_PATH_LIST
  • 출력: LABEL_LIST

"data_label_from_path" 함수

  • 입력: DATA_PATH_LIST, LABEL_LIST, ShuffleBufferSize, batch_size
  • 출력: shuffle된 후, batch_size의 크기(개수)만큼의 image와 LABEL_LIST

"data_list2data"함수는 data_slice_and_batch함수 내에서 작동한다.

  • 입력: DATA_PATH_LIST
  • 출력: mnist image dataset, LABEL_LIST
batch_size = 500
shuffle_buffer_size = 100000

DATA_PATH_LIST = glob('./mnist_png/training/*/*.png')
LABEL_LIST = get_label_from_path(DATA_PATH_LIST)
dataset = data_slice_and_batch(DATA_PATH_LIST, LABELS, shuffle_buffer_size, batch_size)

 

  • batch_size를 500장으로 설정
  • ShuffleBufferSize를 100,000으로 설정(mnist training dataset의 크기가 60,000장이기 때문)
  • glob 모듈로 DATA_PATH_LIST에 mnist training dataset의 path 저장
  • LABEL_LIST에 mnist training dataset에 대한 라벨(0, 1, 2, ..., 9)들을 저장
  • dataset에 batch_size 크기로 출력될 준비가 된 shuffle된 mnist training image dataset 및 LABEL_LIST가 저장
init = tf.global_variables_initializer()
iterator = dataset.make_initializable_iterator()

with tf.Session() as sess:
	sess.run(init, iterator)
	image, label = sess.run(iterator.get_next())

 

모델의 다른 연산을 실행하기 전에 반드시 변수 초기화를 실행해야 합니다. 

  • 변수 초기화를 위한 operation 설정
  • iterator를 초기화 하기 위한 operation 설정

with tf.Session() as sess 구문을 통해 graph를 실행한다.

  • 설정한 init, iterator operation을 실행하여 초기화한다.
  • interator.get_next()를 실행하면 앞서 정해준 batch_size의 크기만큼 image와 label이 return된다. 즉, 위에서 batch_size의 크기를 500으로 설정하였기 때문에 500개의 이미지와 라벨이 image와 label에 각각 저장된다. 그리고 iterator.get_next()를 실행할 때마다 shuffle이 실행된다. 

 

반응형