카테고리 없음

[Data Section]

개발도사(진) 2023. 12. 16. 17:08

우리가 사용할 Dataset을 만든다.

 

먼저 keras core를 설치하고 backend로 tensorflow를 사용할 것임을 명시하고, 필요한 module들을 import한다.

!pip install -q keras-core

import os
import numpy as np
import keras_core as keras

from dataclasses import dataclass

os.environ["KERAS_BACKEND"] = "tensorflow"

 

[Tokenizer] 포스팅에서 Tokenizer를 사용하기 위해서는 Hugging Face의 transformers를, Hugging Face의 dataset을 가져오기 위해서는 dataset을 설치해야 함을 배웠다.  이들을 설치해 준 후 "imbd" dataset을 받아 그 중 traing-text를 x_train 변수에 할당한다.

!pip install -q transformers 
!pip install -q datasets

from datasets import load_dataset

dataset = load_dataset("imdb")
x_train = dataset["train"]["text"]

 

앞선 [Tokenizer] 포스팅에서는 직접 tokenizer를 training 시켰지만, 여기서는 Hugging Face에서 미리 training된 tokenizer를 가져와 사용할 것이다. padding을 넣어 주고 길이는 1000으로 맞춰 준다. from_pretrained 함수의 매개변수는 미리 training 된 model의 이름이다. 

from tokenizers import Tokenizer

tokenizer = Tokenizer.from_pretrained("bert-base-uncased")
tokenizer.enable_padding()
tokenizer.enable_truncation(1000)

 

encode_batch를 사용해서 x_train을 encoding시키고, 그 id 들을 사용하여 x를 다음과 같이 만든다.

temp = tokenizer.encode_batch(x_train)

x = [i.ids for i in temp]

 

여기까지 실행하면, x는 [[],[],[] ... ,[]] 꼴의 list가 되는데, 원소인 list 하나하나가 각 '문장'이 된다.

 

y = dataset["train"]["label"]

다시 train->label을 가져와 y에 할당한다. 이로써 list 형태의  x,y를 가지게 되었지만, 이를 model에 넣기 위해서는 data manipulation이 필요하다. 이를 위해 pytorch의 Dataset class를 이용한다.

import torch

class MyDataset(torch.utils.data.Dataset):
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __getitem__(self, idx):
        x = self.x[idx]
        y = self.y[idx]
        return torch.tensor(x), torch.tensor(y)

    def __len__(self):
        return len(self.x)

이 Dataset class를 상속받은 MyDataset class를 이용하여, x,y를 묶어 하나의 dataset으로 만든다.

ds = MyDataset(x, y)

이 dataset을 이용해 DataLoader를 만든다.

dl = torch.utils.data.DataLoader(ds, batch_size=32,suffle=True)

 

여기까지가 Token Embedding을 위한 input을 만드는 작업이다. 이제 embedding을 위한 embedding layer를 만든다.

@dataclass
class Config:
    vocab_size = tokenizer.get_vocab_size()
    d_model = 5

emb = keras.layers.Embedding(Config.vocab_size, Config.d_model)

tokenizer의 가장 큰 vacabulary size를 가져와서, 이를 input_dim으로 삼는다. 매번 수동으로 input_dim, output_dim을 넣을 수 없기에, 이 작업을 수행하기 위해 위와 같은 Config class를 작성한다.

 

이번에는 layer 역시 class로 만든다. 원래는 Token Embedding+Positional Embedding 두 개를 수행하는 class를 만들어야 하지만, 현재 단계에서는 Token Embedding만 수행하는 class를 구현한다.

class TokenEmbedding(keras.layers.Layer):
    def __init__(self, config):
        super().__init__()
        self.tok_embbeding = keras.layers.Embedding(config.vocab_size, config.d_model)


    def call(self, x):
        x = self.tok_embbeding(x)
        return x

 

config instance를 constructor의 매개변수로 하여 tok_embedding 멤버 변수에 Embedding Layer 객체를 만든다.

위 클래스를 아래와 같이 생성하면, embedding layer를 통과시킬 수 있다.

a = TokenEmbedding(Config)