티스토리 뷰

반응형


학습 또는 연구 목적으로 텐서플로우를 사용하고 있다면 TFRecord라는 파일 포맷을 한번쯤은 만나 보았을 것이다. 아직 만나보지 못하였다면 곧 만나게 될 것이다. 이번 글에서는 TFRecord 데이타 포멧이 무엇이고 어떻게 사용하는지에 대해서 알아 보자.
<모든 것이 그러하지만 알고 지나치는 것과 모르고 그냥 지나치는 것은 분명 미래에 큰 차이를 만들어 낸다.>

"TFRecord 파일 포맷이란 무엇인가?"


TFRecord 파일은 텐서플로우로 딥러닝 학습을 하는데 필요한 데이터들을 보관하기 위한 데이타 포맷이다. 흔히들 텐서플로우의 표준 데이터 파일 포맷이라고도 한다.
TFRecord 파일은 바이너리 데이타 포맷으로 그 본질은 구글에 Protocol Buffer와도 같다. (파일에 데이터를 Serialize하게 저장함)

*Protocol Buffer 참고 : http://bcho.tistory.com/1182

"왜? TFRecord 파일 포맷을 쓰나요?"

- 코드 구현시 더욱 효율적으로 구현 가능하다.

[문제점] : 대부분 학습에 필요한 데이터를 관리할 때 학습 데이터 파일과 각 데이터 파일이 의미하는 label 정보가 담겨 있는 파일 두가지로 관리 하게 된다. 이와 같이 데이터를 분리하여 관리하게 되면 학습 데이터와 라벨 정보를 매칭해주는 코드가 추가로 필요하게 되므로 코드는 더욱 복잡해지게 된다.
[개선] : TFRecord 파일은 학습 데이터 정보와 label 정보를 하나의 파일에 함께 관리하고 있다. 별도의 작업 없이도 TFRecord 파일을 읽어 원하는 정보를 받을 수 있게 된 것이다.

이와 같이 TFRecord파일을 사용하게 된다면 더욱 직관적이고 깔끔한 코드로 작성이 가능 할 것이다.

- 학습 속도가 개선된다.

[문제점] : 이미지 파일과 같은 경우에는 jpg, png 파일로 되어 있을 경우 매번 코드에서 인코딩 / 디코딩 작업을 해줘야 한다. 이와 같은 작업은 학습을 하는데 있어 상당히 비효율적인 부분으로 작용하게 된다.

[개선] : TFRecord 파일은 바이너리 데이타 포맷으로 이와 같은 부수 작업이 필요 없게 된다.

Cloud에서 학습을 하는 경우네는 시간이 곧 돈이다. 최고의 성능으로 짧은 시간에 학습을 할 수 있는 방법은 곧 비용 절감으로 이어질 수 있으며 짧은 시간에 학습 결과를 확인하고 다음 작업을 할 수 있다는 점에서도 아주 유용하다고 생각된다.

- 파일 사이즈

[문제점] : 이미지 파일을 원본으로 관리하게 되면 어마 어마한 파일 사이즈를 확인 할 수 있을 것이다. 특히 학습에 필요한 데이터가 많으면 많을수록 부담스러울 것이라 생각된다. 혼자 작업을 하는 상황이 아닌 서로 데이터를 공유해줘야 하는 상황이라면 데이터 사이즈는 문제가 될 수 있는 부분 중 하나이다.

[개선] : 이미지 파일을 TFRecord 파일로 생성하게 되면 파일 사이즈가 작아진다.

Cloud환경 또는 여러명에서 함께 연구를 하고 데이터를 공유해줘야 하는 상황이라면 파일 사이즈가 작으면 작을수록 더욱 편하게 공유할 수 있을 것이다.

"TFRecord 파일 생성하기"

import tensorflow as tf


def bytes_feature(values):
return tf.train.Feature(bytes_list=tf.train.BytesList(value=[values]))

def int64_feature(values):
if not isinstance(values, (tuple, list)):
values = [values]
return tf.train.Feature(int64_list=tf.train.Int64List(value=values))

def read_imagebytes(imagefile):
file = open(imagefile,'rb')
bytes = file.read()
return bytes

def main():
image_data = read_imagebytes('/home/input_image.jpg')
tf_example = tf.train.Example(features=tf.train.Features(feature={
#feature 정보 입력
'image/encoded': bytes_feature(image_data),
'image/format': bytes_feature(b'jpg'),
'image/class/label': int64_feature(1),
'image/height': int64_feature(75),
'image/width': int64_feature(75),
}))

writer = tf.python_io.TFRecordWriter('/home/output_filename.tfrecord')
writer.write(tf_example.SerializeToString())


main()

위 코드에서 보면 아시겠지만 저장되는 내용은 높이(height),너비(weight), 인코딩 포맷(format), 이미지 바이너리(encoded), 라벨(class/label) 정보 등이 있다. 그 외에도 min/max등에 정보들을 추가로 저장할 수 있다.

이와 같은 정보들은 tf.train.Example 객체를 생성할 때 feature인자로 전달되게 되는데 feature인자는 딕셔너리 형태로 전달된다.

feature={
# feature 정보 입력
'image/encoded': bytes_feature(image_data),
'image/format': bytes_feature(b'jpg'),
'image/class/label': int64_feature(1),
'image/height': int64_feature(75),
'image/width': int64_feature(75),
}

'image/encoded'는 데이타의 name이며 실제 데이타는 텐서플로우 피쳐 타입으로 변환하여 저장한다. (tf.train.Feature(bytes_list=tf.train.BytesList(value=[values])))

이와 같이 생성된 tf.train.Example 객체를 tf.python_io.TFRecordWriter을 이용해서 tfrecord파일에 써주는 것이다.

writer = tf.python_io.TFRecordWriter('/home/hyosung/output_filename.tfrecord')
writer.write(tf_example.SerializeToString())

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함