[ 제 네이버 블로그 글을 티스토리로 이전한 글입니다. 해당 글은 제 네이버 블로그에 2020.09.04에 작성되었었습니다 ]
최근 Tensorflow Entended(TFX)를 사용하는 중입니다
TFX에서 모델을 운영할경우, 입력 데이터를 TF record로 변환하여 사용하게되면 모델에서의 데이터 입력 처리 속도를 빠르게 할 수 있다고 합니다.
이때까지는 raw data를 직접 모델에 [batch, data_shape] 형태로 입력하여 사용했었는데, 이번 기회에 TF record를 적용하여 데이터 처리 속도를 높이고자 했습니다.
테스트 환경
- window 10, python 3,7, tensorflow 2.3.0, tfx 0.22.1
테스트 데이터: MNIST 데이터
TF record 포맷으로 데이터를 저장하기 위해서는...
1) Dictionary 형태로 입력데이터가 구성되어야 한다.
2) Dictionary 내의 개개의 값들은 scalar 또는 1D 형태로 구성되어야 한다.
(1) Dictionary 형태로 입력데이터 구성하기
- MNIST 데이터의 경우... 입력 데이터가 raw_data이고 label 정보가 label일 경우...
아래와 같이 dictionary 형태로 표현가능하다.
temp_data = {
'height': raw_data.shape[0],
'width': raw_data.shape[1],
'raw_img': raw_data.flattent(order='C')
'label': label}
return temp_data
(2) Dictionary 형태의 데이터를 Tensorflow datatype list로 변경하기
- 세가지 형태의 datatype: Int64List, FloatList, ByteList
(데이터 구조마다 일부 차이가 있을 수 있지만, ByteList로 데이터를 encoding할 경우 데이터 size를 줄일 수도 있다고 함)
아래 코드를 적절히 활용해서 Tensorflow datatype list로 변환한다.
def _byte_feature(value):
if isinstance(value, type(tf.constant(0))):
value = value.numpy()
return tf.train.Feature(bytes_list=tf.train.BytesList(value=[value]))
def _float_feature(value):
return tf.train.Feature(float_list=tf.train.FloatList(value=[value]))
def _float_feature_array(value):
return tf.train.Feature(float_list=tf.train.FloatList(value=value))
def _int64_feature(value):
return tf.train.Feature(int64_list=tf.train.Int64List(value=[value]))
def image_example(image_string):
feature = {
'height': _int64_feature(image_string['height']),
'width': _int64_feature(image_string['width']),
'depth': _int64_feature(1),
'label': _int64_feature(image_string['label']),
'image_raw': _float_feature_array(image_string['img_string']),
}
record = tf.train.Example(features=tf.train.Features(feature=feature))
return record
(3) TF record 형태로 파일 저장하기
#Number of TFR files to save the data into
numFiles = 5
records_per_file = int(len(train_data)/numFiles)
for file_id in range(numFiles):
with tf.python_io.TFRecordWriter('MNIST_train_data_strings_' + str(file_id) + '.tfrecord') as writer:
# 모든 데이터 저장할 때까지 반복
for temp_id in range(records_per_file):
convert_data = convert_dict_form(temp_id + file_id * records_per_file)
example = image_example(convert_data)
# TFRecord 파일 쓰기
writer.write(example.SerializeToString())
참고 사이트
https://www.tensorflow.org/tutorials/load_data/tfrecord
https://kaen2891.tistory.com/69
(파이썬에서) 특정 GPU만 사용하고 싶을 때 (0) | 2021.08.01 |
---|---|
PyAudio 설치가 정상적으로 안 될 경우... (0) | 2021.07.30 |
MOSFET (전자회로) (0) | 2021.07.29 |
node js 기반 express 활용해서 https 서버 올릴 시... (0) | 2021.07.28 |
[Cent OS 7] nvidia 그래픽 드라이버 설치 (2) | 2021.03.17 |
댓글 영역