똑같은 데이터에 대해 LSTM, GRU, Transformer를 통해 시계열 예측을 했는데요. sequantial size는 5이고 target size는 1입니다.
class MyLSTMModel(nn.Module):
def __init__(self, input_size, hidden_size, num_layers):
super().__init__()
self.num_layers = num_layers
self.hidden_size = hidden_size
self.lstm = nn.LSTM(input_size, hidden_size, num_layers, batch_first=True)
self.fc = nn.Linear(hidden_size, 1)
def forward(self, data):
h0 = torch.zeros(self.num_layers, data.size(0), self.hidden_size).to(DEVICE)
c0 = torch.zeros(self.num_layers, data.size(0), self.hidden_size).to(DEVICE)
outputs, _ = self.lstm(data, (h0, c0))
last_hs = outputs[:, -1, :]
prediction = self.fc(last_hs)
return prediction
class MyGRUModel(nn.Module):
def __init__(self, input_size, hidden_size, num_layers):
super().__init__()
self.num_layers = num_layers
self.hidden_size = hidden_size
self.gru = nn.GRU(input_size, hidden_size, num_layers, batch_first=True)
self.fc = nn.Linear(hidden_size, 1)
def forward(self, data):
h0 = torch.zeros(self.num_layers, data.size(0), self.hidden_size).to(DEVICE)
outputs, _ = self.gru(data, h0)
last_hs = outputs[:, -1, :]
prediction = self.fc(last_hs)
return prediction
class MyTransformerModel(nn.Module):
def __init__(self, input_size, hidden_size, num_layers):
super().__init__()
self.num_layers = num_layers
self.hidden_size = hidden_size
# 입력 Embedding 레이어
self.input_embedding = nn.Linear(input_size, hidden_size)
# Positional Encoding (학습 가능한 파라미터로 설정)
self.positional_encoding = nn.Parameter(torch.zeros(1, SEQ_LENGTH, hidden_size))
# Transformer Encoder Layers
self.encoder_layer = nn.TransformerEncoderLayer(
d_model=hidden_size, nhead=4, batch_first=True
) # num_heads=4 설정
self.transformer_encoder = nn.TransformerEncoder(self.encoder_layer, num_layers=num_layers)
# Fully Connected Layer
self.fc = nn.Linear(hidden_size, 1)
def forward(self, data):
# 입력 Embedding과 Positional Encoding 추가
embedded_data = self.input_embedding(data)
embedded_data += self.positional_encoding[:, :embedded_data.size(1), :]
# Transformer Encoder 통과
outputs = self.transformer_encoder(embedded_data)
# 마지막 타임스텝의 출력만 사용
last_hs = outputs[:, -1, :]
prediction = self.fc(last_hs)
return prediction
순서대로 LSTM, GRU, Transformer의 결과 사진과 각각의 코드입니다.
이 결과를 어떻게 해석할 수 있으며 어떤 개선방향을 찾아보는 것이 좋을까요 ?