huggingface에 있는 모델을 직접 사용하는 경우 tokenizer.encode를 한 뒤에 모델에 적용하였는데도 오류가 발생하는 문제가 있어서 정리해보려고 한다.
문제
from transformers import RobertaTokenizer, RobertaForSequenceClassification
tokenizer = RobertaTokenizer.from_pretrained(HUGGINGFACE_ID)
model = RobertaForSequenceClassification.from_pretrained(HUGGINGFACE_ID)
input_ids = tokenizer.encode('''import json
import os
print('hello')''')
logits = model(input_ids)[0]
'''--------------------------------------------------------------------
if self.config.pad_token_id in input_ids[:, [-1, 0]]:
TypeError: list indices must be integers or slices, not tuple
--------------------------------------------------------------------'''
위에 코드같이 작성을 하면 주석과 같은 오류가 발생한다. 이에 대해서 교수님이 알려주신 stackoverflow 주소를 참고해 보니 'tokenizer.encode('<code>', return_tensors = 'pt')로 변경하여 모델에 적용하니 쉽게 해결되었다.
이에 대해서 tokenizer.encode()를 그냥 사용하는 것이랑 return_tensors = 'pt' 매개변수를 집어넣는 결과값의 차이를 알아보았다.
tokenizer.encode() 메소드 매개변수 있냐 없냐의 차이
from transformers import RobertaTokenizer, RobertaForSequenceClassification
#HUGGINGFACE_ID는 어떤 모델의 ID
tokenizer = RobertaTokenizer.from_pretrained(HUGGINGFACE_ID)
model = RobertaForSequenceClassification.from_pretrained(HUGGINGFACE_ID)
input_ids = tokenizer.encode('''import json
import os
print('hello')''', return_tensors = 'pt')
input_id_test = tokenizer.encode('''import json
import os
print('hello')''')
print(input_ids)
print(input_id_test)
'''--------------------------------------------------------------------
tensor([[ 0, 3578, 1644, 203, 1288, 1946, 1393, 203, 1288, 1492,
394, 15418, 505, 2]])
[0, 3578, 1644, 203, 1288, 1946, 1393, 203, 1288, 1492, 394, 15418, 505, 2]
--------------------------------------------------------------------'''
위에 코드를 살펴보면 return_tensors = 'pt'를 넣은 input_ids는 결과값이 tensor(<list>)의 형태로 반환되었고 그냥 tokenizer.encode() 메소드를 사용한 결과값인 input_id_test는 <list> 형태로 반환되었다.
결론
tokenizer.encode()메소드를 사용하여 모델에 적용할 때, 오류가 발생한다면 return_tensors = 'pt'처럼 return 형태가 제대로 되어있는지 확인을 해봐야 한다. 각각의 모델마다 입력을 받는 형태(type)가 다르기 때문에 발생하는 문제인 것 같다.
tensor()와의 차이와 왜 오류가 발생했는지는 아직까지 정확하게 이해하지 못했다. 좀 더 찾아보면서 각 반환 값 형태가 어떻게 다르고 왜 다른 것을 만들었는지 찾아봐야겠다.
'머신러닝_공부 > 파이썬' 카테고리의 다른 글
[Linux] scp를 통해서 간편하게 파일/폴더 전송하기 (0) | 2024.05.20 |
---|---|
[Window/ssh] 윈도우에서 ssh 간편 설정방법 (ssh config) (0) | 2024.05.20 |
[파이썬/사이킷런] SVM관련 궁금한 점들 (0) | 2024.04.10 |
[파이썬] 패키지(모듈)의 버전 체크하는 방법 (0) | 2023.08.13 |
댓글