본문 바로가기

NLP 자연어 처리, Natural Language Processing

NLP data를 tf.record로 변환하기

다음 블로그를 보고 수정하였습니다.

kaen2891.tistory.com/65
 

2차원 음성 대용량 데이터셋을 TfRecord로 만들기

Tensorflow는 pytorch의 dataloader처럼 queue를 사용하여, 전체 데이터셋을 가져온 뒤 그것을 batch 만큼 쪼개서 하는 것이 살짝 번거롭다. 즉 이말을 다시 풀어보면, pytorch에서는 dataloader를 사용하여 여러.

kaen2891.tistory.com

 

1. 테스트 데이터

 

해당 데이터는 임의적으로 만든 데이터 data1.txt, data2.txt 입니다.

 

 

2. tf.record 파일 생성

 

writer 코드입니다.

import tensorflow as tf
print(tf.__version__)

import os
from glob import glob
import numpy as np
from tqdm import tqdm

def _bytes_feature(value):
    """Returns a bytes_list from a string / byte."""
    return tf.train.Feature(bytes_list=tf.train.BytesList(value=[value]))

def serialize_example(batch, list1):
    filename = "./train_set.tfrecords"

    writer = tf.io.TFRecordWriter(filename)

    for i in tqdm(range(batch)):
        feature = {}
        lines_dataset = tf.data.TextLineDataset(list1[i])
        for text_data in lines_dataset:
#             print(text_data)
            feature['input'] = _bytes_feature(text_data.numpy())
            features = tf.train.Features(feature=feature)
            example = tf.train.Example(features=features)
            serialized = example.SerializeToString()
            writer.write(serialized)
        
list_input = sorted(glob('./*.txt'))

serialize_example(len(list_input), list_input)

결과입니다.

3. tf.record 읽기

 

코드입니다.

import tensorflow as tf

record_file = './train_set.tfrecords'


feature_description = {
    'input' : tf.io.FixedLenSequenceFeature([], tf.string, allow_missing=True)
}

def _parse_text_function(example_proto):
    return tf.io.parse_single_example(example_proto, feature_description)

def input_fn(record_file, batch_size, buffer_size):
    dataset = tf.data.TFRecordDataset(record_file)
    print('raw_dataset', dataset)

    parsed_text_dataset = dataset.map(_parse_text_function)
    print('map', parsed_text_dataset)

    train_dataset = parsed_text_dataset.shuffle(buffer_size).batch(batch_size) # 선택사항 : , drop_remainder=True)
    print('buffer + batch', train_dataset)

    train_datset = train_dataset.prefetch(tf.data.experimental.AUTOTUNE)
    print('train_dataset autotune', train_dataset)
    
    return train_dataset

batch_size = 3
train_dataset = input_fn(record_file, batch_size=batch_size, buffer_size=10)
print(train_dataset)

for (batch, text) in enumerate(train_dataset):

    enc_raw = text['input']
    print(enc_raw)

결과입니다.

 

4. Tokenizer 한 다음 tf.record 생성하기

 

코드는 추후에 올려드리겠습니다.

반응형