일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 오블완
- WSSS
- HookNet
- docker
- Decision Boundary
- CellPin
- 티스토리챌린지
- GIT
- 히비스서커스
- logistic regression
- Pull Request
- Multi-Resolution Networks for Semantic Segmentation in Whole Slide Images
- cs231n
- 기초확률론
- docker exec
- airflow
- numpy
- 백신후원
- ssh
- 코크리
- IVI
- cocre
- 도커
- Jupyter notebook
- AIFFEL
- aiffel exploration
- vscode
- docker attach
- 프로그래머스
- 사회조사분석사2급
- Today
- Total
히비스서커스의 블로그
[Tensorflow] RNN에서 padding 방법 (pre vs post) 본문
RNN의 적용방법에는 다양한 방법이 있다.
이들 중 감성분류에 쓰이는 many to one 방법(빨간색)과 주어진 단어들을 토대로 작문에 쓰이는 many to many 방법(연두색)에서 padding 방식을 pre와 post 어느 것으로 하면 좋을지 직관적으로 생각해보았다.
먼저 padding을 RNN 에서 사용되는 의미로 간단히 말하자면 각각의 입력(token, sequence 등등)의 길이가 모두 같지 않기에 이를 맞춰주기 위해 0을 넣어주는 작업이라고 생각하면 좋다. 여기서 앞에서 0을 넣어주는 방식이 pre 방식이고 뒤에서 넣어주는 방식이 post방식이다.
아래에 예시 코드와 결과이다.
# Padding
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.preprocessing.sequence import pad_sequences
from pprint import pprint
# pprint: 보기 좋게 출력해주는 역할
# pad_sequences:
sentences = [['barber', 'person'],
['barber', 'good', 'person'],
['knew', 'secret'],
['secret', 'kept', 'huge', 'secret'],
['barber', 'kept', 'word'],
['barber', 'kept', 'secret'],
['keeping', 'keeping', 'huge', 'secret', 'driving', 'barber', 'crazy'],
['barber', 'went', 'huge', 'mountain']]
tokenizer = Tokenizer()
tokenizer.fit_on_texts(sentences)
encoded = tokenizer.texts_to_sequences(sentences)
print(f"original input data = ")
pprint(encoded)
padded1 = pad_sequences(encoded, padding='pre') #pre는 앞에서부터 0을 붙이는 역할
print(f"pre padded = \n{padded1}")
padded2 = pad_sequences(encoded, padding='post') #post는 뒤에서부터 0을 붙이는 역할
print(f"post padded = \n{padded2}")
0은 정보를 담고 있지 않기 때문에 pre방식은 뒤에 정보가 밀집되고, post방식은 앞에 정보가 밀집된다.
다시 위의 그림으로 돌아가보자.
감성분류에 쓰이는 many to one의 모델 같은 경우에는 마지막 정보가 가장 큰 영향을 주어 최종적인 결과 하나를 만들어낸다. 만약, 마지막 정보로 패딩된 값0이 들어가게 된다면 효율이 안 좋을 것이다.
따라서, 모델을 만들어줄 때 train 데이터의 padding 방식은 pre 방식이 더 좋을 것이다!
이와는 다르게 주어진 단어들을 토대로 작문을 하게 하는 many to many의 모델 같은 경우는 처음 값들의 결과를 토대로 문장을 이어나가게 된다. 처음에 주어진 정보가 간접적으로 끝까지 영향을 줄 것이라는 의미이다. 이런 경우에는 처음 정보에 패딩된 값 0이 들어가게 된다면 효율이 안 좋을 것이다.
따라서, 모델을 만들어줄 때 train 데이터의 padding 방식은 post 방식이 더 좋을 것이다!
직관적인 방법으로 생각을 한 것이기에 정확하지 않을 것이고 매번 맞다고는 할 수 없을 것이다. 하지만, 직관적인 느낌을 얻는데 도움이 되었으면 좋겠다.
-히비스서커스-
'Programming > Python' 카테고리의 다른 글
[Python] python으로 multiprocessing 해보기 (2) | 2021.06.30 |
---|---|
[Numpy] 2 dimension, 3 dimension array에서 slicing하기 (2) | 2021.06.25 |
[Python] 파이썬 클래스, 모듈 (0) | 2021.01.28 |
[Python] colab에서 konlpy 사용 및 구글드라이브에서 데이터 불러오기 (2) | 2021.01.15 |
[Python] 파이썬 기초 (함수,변수, 제어문, 리스트,딕셔너리) (0) | 2021.01.04 |