π RuntimeError: stack expects each tensor to be equal size, but got [32] at entry 0 and [24] at entry 1
π κ°λ³ κΈΈμ΄μ ν
μλ₯Ό λ°μ΄ν°λ‘λμ μ λ¬νλ κ²½μ°
컀μ€ν
λ°μ΄ν° ν΄λμ€μ λ°μ΄ν°λ‘λλ₯Ό ν΅ν΄ λ°νλλ λ°μ΄ν° μΈμ€ν΄μ€μ ν
μ ν¬κΈ°κ° μΌμ νμ§ μμ λ°μνλ μλ¬λ€. νΉν μμ°μ΄ μ²λ¦¬μμ μμ£Ό μ°Ύμ λ³Ό μ μλλ° λ°μ΄ν°λ‘λ κ°μ²΄ μ μΈ μ, 맀κ°λ³μ μ΅μ
μ€μ collate_fn=collate
λ₯Ό μΆκ°ν΄μ£Όλ©΄ ν΄κ²° κ°λ₯ν μλ¬λ€. μ΄ λ 맀κ°λ³μ collate_fn
μ μ λ¬νλ κ°(λ©μλ)μ μ¬μ©μκ° μ§μ μ μν΄μ€μΌ νλ€. νκΉ
νμ΄μ€ λΌμ΄λΈλ¦¬λ¬μ μν©μ λ§κ² 미리 μ μλ collate
λ©μλλ₯Ό μ§μν΄μ£Όκ³ μκΈ° λλ¬Έμ μ μ΄μ©νλ©΄ λλ€. νμμ κ²½μ°μλ 컀μ€ν
μΌλ‘ μ§μ μ μν λ©μλ, κ°μ²΄λ₯Ό μ¬μ©νκ³ μλ€.
# λ°μ΄ν° λ‘λ μμ
loader_train = DataLoader(
train_dataset,
batch_size=self.cfg.batch_size,
shuffle=True,
worker_init_fn=seed_worker,
collate_fn=MiniBatchCollate, # μ¬κΈ°μ μ¬μ©νλ €λ collate function νΉμ κ°μ²΄λ₯Ό μ λ¬νμ!!
generator=self.generator,
num_workers=self.cfg.num_workers,
pin_memory=True,
drop_last=False,
)
# collate λ©μλ μμ:
class MiniBatchCollate(object):
"""
Collate class for torch.utils.data.DataLoader
This class object to use variable data such as NLP text sequence
If you use static padding with AutoTokenizer, you don't need this class
But if you use dynamic padding with AutoTokenizer, you must use this class object & call
Args:
batch: data instance from torch.utils.data.DataSet
"""
def __init__(self, batch: torch.utils.data.DataLoader) -> None:
self.batch = batch
def __call__(self) -> tuple[dict[Tensor, Tensor, Tensor], Tensor, Tensor]:
inputs, labels, position_list = self.batch
labels = torch.nn.utils.rnn.pad_sequence(
labels,
batch_first=True,
padding_value=-1
)
position_list = torch.nn.utils.rnn.pad_sequence(
position_list,
batch_first=True,
padding_value=-1
)
return inputs, labels, position_list
def collate(inputs):
"""
slice input sequence by maximum length sequence in mini-batch, used for speed up training
if you want slice other variable such as label feature, you can add param on them
This Function should be used after DataLoader return mini-batch instance
Args:
inputs: list of dict, dict has keys of "input_ids", "attention_mask", "token_type_ids"
"""
mask_len = int(inputs["attention_mask"].sum(axis=1).max())
for k, v in inputs.items():
inputs[k] = inputs[k][:, :mask_len]
return inputs
μΌλ°μ μΌλ‘ collate
λ λ©μλλ‘ κ΅¬νν΄μ μ¬μ©νμ§λ§, μ μ½λμ²λΌ κ°μ²΄λ‘ ꡬννκ³ λ΄λΆμ __call__
λ₯Ό μ μν΄ μ¬μ©νλ λ°©λ²λ μλ€. νμ μμ λ¨μΌ λ©μλ ννλ₯Ό κ³μν΄μ μ¬μ©νλ€κ° μ΅κ·Ό λ€μ΄ μν ν λ²μ μλ‘ λ€λ₯Έ λ°μ΄ν° μΈνΈ λ° λͺ¨λΈμ νλ ¨ μμΌμΌ νλ μν©μ λ§μ£Όν μ΄ν κ°μ²΄ ννλ‘ λ€μ ꡬνν΄ μ¬μ©νκ³ μλ€.
ννΈ μμ μ½λ κ°μ₯ λ§μ§λ§ collate
λ©μλλ μ
λ ₯ μνμ€κ° huggingfaceμ AutoTokenizer.encode_plus
λ₯Ό μ΄μ©ν΄ μ¬μ©μ μ§μ max_len
κΉμ§ ν¨λ©μ λ§μΉ μνλΌλ κ°μ νμ ꡬν λμλ€. ν΄λΉ λ©μλλ μμ λ°μν μλ¬λ₯Ό ν΄κ²°νκΈ° μν¨λ³΄λ€, λ―Έλ λ°°μΉμ μν μ 체 λ°μ΄ν° μ€μμ μ΅λ κΈΈμ΄κ° μ¬μ©μ μ§μ max_len
κΉμ§ λ―ΈμΉμ§ λͺ»νλλ° ν¨λ©μ΄ λ κ²½μ°μ μ¬μ©νκΈ° μν΄ λ§λ€μλ€. λΆνμν ν¨λ©μ trucation
νμ¬ λ΄λ΄ λ€νΈμν¬μ νμ΅ μλλ₯Ό λμ΄κΈ° μν¨μ΄λ€. ν΄λΉ λ©μλλ ν¬μ€ν
μ μ λͺ©μ λ¬λ¦° μλ¬λ₯Ό ν΄κ²°νλλ° μ¬μ©ν μλ μμ§λ§ collate
κΈ°λ₯μ μΈκΈνλ κΉμ μκ°μ΄λ κ°μ΄ μ 리ν΄λ΄€λ€. μ΄ λ©μλλ torch.utils.data.DataLoader
μ μΈμκ° μλλΌ, λ©μΈ νμ΅ λ£¨ν λ΄λΆμ μ¬μ©νλ€. λ€μ λ§ν΄, λ°μ΄ν°λ‘λκ° λ°°μΉ μΈμ€ν΄μ€λ₯Ό λ°νν λ€μ μ¬μ©νλ©΄ λλ€λ κ²μ΄λ€. ν¨λ©λ°©μκ³Ό collate
κΈ°λ₯μ λν μμΈν μ€λͺ
μ λ€λ₯Έ ν¬μ€ν
μμ λ€λ£¨λλ‘ νκ² λ€.
λ°λ©΄ MiniBatchCollate
κ°μ²΄λ torch.utils.data.DataLoader
μ collate_fn
μΈμμ μ λ¬νλ©΄ λλ€. νμμ κ²½μ°λ Dynamic Padding
κΈ°λ²μ μ¬μ©νκΈ° λλ¬Έμ λ―Έλ λ°°μΉ λ΄λΆμ μΈμ€ν΄μ€λ€μ΄ μλ‘ λ€λ₯Έ μνμ€ κΈΈμ΄λ₯Ό κ°λ κ²½μ°κ° λ°μνλ€. λ°μ΄ν°λ‘λλ λ―Έλ λ°°μΉμ μνλ λ°μ΄ν°μ κΈΈμ΄κ° ν΅μΌλμ§ μμΌλ©΄ λ°°μΉ λ¨μλ‘ λ°μ΄ν°λ₯Ό λ¬Άμ μ μκ² λλ€. λ°λΌμ λ―Έλ λ°°μΉ λ¨μμ κΈΈμ΄ ν΅μΌμ μν΄ torch.nn.utils.rnn.pad_sequence
λ©μλλ₯Ό μ¬μ©νλ€. μ΄ λ©μλλ μ
λ ₯ν λ―Έλ λ°°μΉ λ°μ΄ν° μ€μμ κ°μ₯ κΈ΄ μνμ€λ₯Ό κΈ°μ€μΌλ‘ λͺ¨λ λ°μ΄ν° κΈΈμ΄λ₯Ό ν΅μΌνλ€. batch_first=True
λ₯Ό μ£Όλͺ©νμ. μ΄ μΈμλ₯Ό False
λ‘ μ€μ ν κ²½μ°, λ°°μΉ μ°¨μμ΄ λ§¨ μμ΄ μλλΌ μ€κ°μ μ μλλ€. μΌλ°μ μΌλ‘λ λ°°μΉ μ°¨μμ 맨 μμ λλ μν¬νλ‘μ°λ₯Ό μ¬μ©νκΈ° λλ¬Έμ κΌ ν΄λΉ μΈμλ₯Ό True
λ‘ μ€μ νκ³ μ¬μ©νμ.
Leave a comment