반응형

(텐서플로우 공식 홈페이지 : https://www.tensorflow.org/guide/data 의 내용을 기준으로 다시 정리함.)

 

  • 파이프라인(영어: pipeline)

컴퓨터 과학에서 파이프라인(영어: pipeline)은 한 데이터 처리 단계의 출력이 다음 단계의 입력으로 이어지는 형태로 연결된 구조를 가리킨다. 이렇게 연결된 데이터 처리 단계는 한 여러 단계가 서로 동시에, 또는 병렬적으로 수행될 수 있어 효율성의 향상을 꾀할 수 있다. 각 단계 사이의 입출력을 중계하기 위해 버퍼가 사용될 수 있다. (출처 : 위키wikipedia)

>>> 간단하게 생각해서 여러 단계(A, B, C)를 거쳐 데이터를 처리하는 경우, 각각의 단계의 결과가 각기 다른 형태를 갖게 되는 경우, 다음 단계로 진행하기 위한 작업이 필요하게 된다. 하지만, 각 단계의 결과가 동일 형태를 갖도록 처리된다면 다음 단계로의 진행을 위한 별도 작업없이 매끄럽게 진행이 가능하다. 즉, 파이프라인은 수도배관을 연결하듯, 공통된 형태 출력 형태를 갖게 함으로써 이후 확장을 유연하게 하는 것이다.

 

  • 일괄 처리(batch processing)

일괄 처리(batch processing)란 컴퓨터 프로그램 흐름에 따라 순차적으로 자료를 처리하는 방식을 뜻한다. 초기의 일괄처리 방식은 사용자와 상호작용하는 것이 불가능했지만, 운영 체제가 발전함에 따라 프로그램 입출력을 통해 상호작용하는 것이 가능해졌다. 일괄 처리는 1950년대 전자 컴퓨팅 초기 시절 이후 메인프레임 컴퓨터와 함께하고 있다. (출처 : 위키wikipedia)

>>> 배치 처리는 두가지로 볼 수 있을 것 같다. 첫번째는 금융권등에서 온라인(실시간)으로 처리하기 힘든 작업들을 모아 시스템 자원 등의 여유가 있는 시간대(주로 야간)에 일괄 처리하는 방법과, 두번째, ML 관련 서적등에서 나오는 배치, 즉 전체 데이터를 일정 크기로 쪼개서 처리하는 방법이다. 하지만, 한 단계 더 깊이 생각해 보면, 전체 데이터에서 일부분을 모아 처리한다는 동일한 방법으로도 볼 수 있을 것이다.


tf.data : Build Tensorflow input pipeline

tf.data API는 대용량, 각각 다른 포멧의 데이터로부터 입력 파이프라인을 만들 수 있도록 한다. 예를 들면,

  • 이미지 모델의 경우
    : 분산된 파일로부터 데이터를 읽어 각 이미지에 전처리를 위한 연산을 적용 후 배치를 적용할 수 있다.
  • 텍스트 모델의 경우
    : raw 텍스트로부터 lookup 테이블을 갖는 임베딩 식별자로 변환하고, 다른 길이의 시퀀스를 함께 배치처리 할 수 있게 한다.

import tensorflow as tf

import pathlib
import os
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
 

# numpy 출력 자리수 설정
np.set_printoptions(precision=4)


Basic mechanics

입력 파이프라인을 생성하려면 data source에서 시작해야 한다. 

  • 메모리에 있는 데이터로부터 Dataset을 구성하려면
    : tf.data.Dataset.from_tensor() 또는 tf_data.Datset.from_tensor_slices()
  • TFRecord 포멧파일로부터 Dataset을 구성하려면
    : tf.data.Dataset.TFrecordDataset()

Dataset 객체 생성 후 chaing method를 tf.data.Dataset에서 호출하여 새로운 Dataset을 생성할 수 있다. 예를 들면,

각 요소에 각각 적용되는 Dataset.map(), 여러개의 요소에 적용되는 Dataset.batch() 등이 있다. (이 부분은 이후 별도로 정리할 예정)

 

Dataset 객체는 python iterable로 for loop를 사용이 가능하다.

dataset = tf.data.Dataset.from_tensor_slices([8, 3, 0, 8, 2, 1])
dataset

<TensorSliceDataset shapes: (), types: tf.int32>

for elem in dataset:
  print(elem.numpy())

8
3
0
8
2
1

또는 iter를 사용하여 python iterator를 명시적으로 생성하고 next를 사용할 수도 있다.

it = iter(dataset)
print(next(it).numpy())

8

Chaining method중 하나인 reduce 변환을 사용할 수 도 있다.  

reduce(
    initial_state
, reduce_func
)

reduce는 입력 데이터셋을 단일 요소로 감소시킨다.

이 변환은 reduce_func을 입력 데이터셋의 모든 요소에서 호출하고 internal state에 정보를 모은다. initial_state 인자는 초기 상태를 위해 사용되고 final state는 결과로 반환된다.

print(dataset.reduce(0, lambda state, value: state + value).numpy())
22
반응형

+ Recent posts