[파이토치] 딥러닝 에러 해결 : stack expects each tensor to be equal size, but got...

Mollang·2022년 11월 12일
2

Pytorch

목록 보기
1/1

DatoLoader 에러

사용 모델 :
HuggingFace'
cardiffnlp/twitter-roberta-base-sentiment

에러 발생 지점 : 데이터로더(torch.utils.data.DataLoader)


- 에러메시지 :
RuntimeError: stack expects each tensor to be equal size, but got [8] at entry 0 and [21] at entry 1


DatoLoader에서 흔히 발생하는 에러 중 하나인데, 발생 이유는 batch 단위에 있는 데이터들의 size가 일치하지 않아서이다.

사전학습 모델을 사용할 때엔 해당 모델에 맞는 Tokenizer를 사용한다.

(1) 데이터 특성에 맞는 데이터셋 클래스를 정의하고 (2) Torch에 내장된 DataLoader를 사용하여, 모델에 집어넣을 데이터를 사전에 설정한 배치 사이즈만큼 불러온다(load).

(2)번 단계에서 자주 발생하는 에러가 "stack expexts each tensor to be equal size, but got.." 에러인데, 메시지가 의미하듯 "동일한 사이즈"의 텐서가 들어와야하는데 서로 다른 사이즈가 들어왔을 때 발생한다.

사전학습 모델의 토크나이저에는 padding을 설정하는 파라미터가 따로 있기 때문에, 웬만하면 파라미터 설정을 통해 바로 해결된다.

tokenizer 파라미터

  • text
  • add_specaial_tokens
  • padding
  • truncation
  • max_length

입력 예시 :

tokenizer(text, add_special_tokens=True, padding="max_length", truncation=True)

그러나 위처럼 padding 옵션을 설정했음에도 에러가 발생한다면, 아래 해결 방법을 참고하면 된다.

에러 해결 단계

1. tokenizer에 max_length 직접 전달

tokenizer(text, add_special_tokens=True, padding="max_length", max_length = 327, truncation=True)

tokenizer별로 max_length를 알아서 인식하여 곧바로 tokenize를 실행하는 애가 있고, max_length가 사전에 정의되어 있지 않아서 사용자가 직접 max_length설정을 통해 전달해줘야하는 애가 있다. 만약 "분명히 나는 파라미터 설정까지 해줬는데 왜 에러가나지?" 싶으면, max_length 전달만 추가적으로 진행해주면 된다.

(보통 max_length는 자신이 사용하는 데이터의 최대길이를 전달하는데, 자신의 데이터 특성 상 최대 길이 전부를 보존할 필요가 없다면 더 짧게 설정해줘도 된다.)

2. 데이터로더 - collate_fn 함수 전달

위처럼 했음에도 에러가 난다면, DataLoader에 collate_fn 파라미터를 전달하면 된다. 이 경우 사용자가 따로 함수를 설계해주어야한다.

Torch의 DataLoader에는 collate_fn 파라미터가 있는데 이 파라미터가 바로 데이터간의 길이를 일치시키는 역할을 수행한다.

torch.utils.data.DataLoader(train_data, batch_size = batch_size, shuffle=False, **collate_fn = collate_fn**)
  • 함수 예시
def collate_fn(batchDummy): 
  x = [torch.LongTensor(batch['x'])for batch in batchDummy] 
  # batch단위로 데이터가 넘어올 때 아래 pad_sequence를 통해 알아서 padding을 해준다
  x = torch.nn.utils.rnn.pad_sequence(x, batch_first = True) 
  return {'x' : x}

1개의 댓글

comment-user-thumbnail
2022년 11월 28일

오 도움많이 받고 갑니다~

답글 달기