🔥알림🔥
① 테디노트 유튜브 - 구경하러 가기!
② LangChain 한국어 튜토리얼 바로가기 👀
③ 랭체인 노트 무료 전자책(wikidocs) 바로가기 🙌

1 분 소요

이번에는 지난 LSTM 입력 텐서와 출력 텐서의 shape 이해 의 후속편으로써, pytorch의 GRU layer의 입출력 텐서의 shape에 대하여 이해해 보고 세부 옵션에 대하여 자세히 알아보도록 하겠습니다.


(참고)

GRU

  • input_size: input x에 대한 features의 수

  • hidden_size: hidden state의 features의 수

  • num_layers: GRU을 스택킹(stacking)하는 수

  • batch_first: 입출력 텐서의 형태가 다음과 같음. 기본값은 False

    • True로 설정시 (batch, seq, feature)

    • False로 설정시 (seq, batch, feature)

    • (주의사항) hidden_state에는 영향을 미치지 않습니다.

  • bidirectional: 양방향 GRU 구현 여부. 기본값은 False

import torch
import torch.nn as nn

gru = nn.GRU(input_size=10, hidden_size=32, num_layers=1, batch_first=True, bidirectional=False)
gru
GRU(10, 32, batch_first=True)

출력에 대한 이해

입력에 활용할 텐서 생성

inputs = torch.zeros(1, 35, 10)
print(inputs.shape)
# batch_size, sequence_length, number of features
torch.Size([1, 35, 10])
outputs, hidden_state = gru(inputs)
print(outputs.shape, hidden_state.shape)
torch.Size([1, 35, 32]) torch.Size([1, 1, 32])

outputs 의 shape에 대한 이해

  • [1, 35, 32] 형태를 가집니다. 순서대로 (batch_size, sequence_length, hidden_size(32) x bidirectional(1)) 입니다.

hidden_state 의 shape에 대한 이해

  • [1, 1, 32] 형태를 가집니다. 순서대로 (Bidirectional(1) x number of layers(1), batch_size, hidden_size(32)) 입니다.

Stacking GRU

  • GRU를 겹층으로 쌓아올리는 것을 Stacking이라고 합니다. 이렇게 쌓아올렸을 때는 결과 shape가 달라지게 됩니다.

  • num_layers에 쌓고자 하는 층의 개수를 입력합니다.

gru = nn.GRU(input_size=10, hidden_size=32, num_layers=2, batch_first=True, bidirectional=False)
gru
GRU(10, 32, num_layers=2, batch_first=True)
inputs = torch.zeros(1, 35, 10)
print(inputs.shape)
# batch_size, sequence_length, number of features
torch.Size([1, 35, 10])
outputs, hidden_state = gru(inputs)
print(outputs.shape, hidden_state.shape)
torch.Size([1, 35, 32]) torch.Size([2, 1, 32])

outputs 의 shape에 대한 이해

  • [1, 35, 32] 형태를 가집니다. 순서대로 (batch_size, sequence_length, hidden_size(32) x bidirectional(1)) 입니다.

hidden_state 의 shape에 대한 이해

  • [2, 1, 32] 형태를 가집니다. 순서대로 (Bidirectional(1) x number of layers(2), batch_size, hidden_size(32)) 입니다.

Bidirectional GRU

  • 양방향 GRU을 사용하기 위해서는 bidirectional=True로 설정합니다.
gru = nn.GRU(input_size=10, hidden_size=32, num_layers=2, batch_first=True, bidirectional=True)
gru
GRU(10, 32, num_layers=2, batch_first=True, bidirectional=True)
inputs = torch.zeros(1, 35, 10)
print(inputs.shape)
# batch_size, sequence_length, number of features
torch.Size([1, 35, 10])
outputs, hidden_state = gru(inputs)
print(outputs.shape, hidden_state.shape)
torch.Size([1, 35, 64]) torch.Size([4, 1, 32])

outputs 의 shape에 대한 이해

  • [1, 35, 64] 형태를 가집니다. 순서대로 (batch_size, sequence_length, hidden_size(32) x bidirectional(2)) 입니다.

hidden_state 의 shape에 대한 이해

  • [4, 1, 32] 형태를 가집니다. 순서대로 (Bidirectional(2) x number of layers(2), batch_size, hidden_size(32)) 입니다.

댓글남기기