Deep learning 구현

excel, csv, data frame으로 torch dataloader 만들기(BERT용)

공돼 2022. 9. 22. 00:07

1. 통으로 바꾸기

 

csv, excel, parquet로 된 data를 data frame 으로 읽어오기

 

data_train = pd.read_parquet(train_file_path)[[source_var, target_var]]



lab_encoder로 label column의 데이터를 숫자화 시킴

 

lab_encoder.fit(data_all[target_var])

data_train[target_var] = lab_encoder.transform(data_train[target_var])



dataset의 from_pandas 이용해서 위에서 만든 data frame으로 dataset 만들기

raw_train = Dataset.from_pandas(data_train)



tokenizer 사용해서 dataset을 tokenizing 하고 torch format으로 변경

def tokenize_function(examples):

    return tokenizer(examples['text'], padding="max_length", truncation=True)

tokenized_train = raw_train.map(tokenize_function, batched=True)

tokenized_train = tokenized_train.remove_columns(["text"])

tokenized_train.set_format("torch")



tokenizing 된 dataset 을 Dataloader에 넣어줘서 dataloader 생성

train_dataloader = DataLoader(tokenized_train, shuffle=True, batch_size=16)

 

2. custom Dataset 이용

 

custom Dataset 함수 정의

    class MyDataset(Dataset):
        def __init__(self, encodings, labels):
            self.encodings = encodings
            self.labels = labels

        def __getitem__(self, idx):
            item = {}
            item['input_ids'] = torch.tensor( self.encodings[idx]['input_ids'] )
            item['attention_mask'] = torch.tensor(self.encodings[idx]['attention_mask'])
            item['labels'] = torch.tensor(int(self.labels[idx]))
            return item

        def __len__(self):
            return len(self.labels)
csv로부터 dataset load
 
    raw_data = load_dataset("csv", data_files={'train': train_file_path})
 
tokenizer 선언과 tokenize function 선언
 
    tokenizer = BertTokenizer.from_pretrained("bert-base-uncased")
    def tokenize_function(examples):
        ret = tokenizer(examples['msg'], padding="max_length", truncation=True, max_length = MAX_LENGTH)
        return ret
   
tokenizer function을 거치고 이것으로 custom Dataset init해준 후 처리된 data를 DataLoader에 넣어 dataloader 만들어줌. 
 
    tokenized_data = raw_data.map(tokenize_function, batched=True)
    mtrain_dataset = MyDataset(tokenized_data["train"], tokenized_data["train"]['labels'])
    train_dataloader = DataLoader(mtrain_dataset, batch_size=args.bs, shuffle=True, drop_last=True)