最近項目用到了LSTM ,但是對LSTM 的輸入輸出不是很理解,對此,我詳細查找了lstm 的資料
import torch.nn as nnclass LSTMModel(nn.Module):def __init__(self, input_size=1, hidden_size=50, num_layers=2):super(LSTMModel, self).__init__()self.hidden_size = hidden_sizeself.num_layers = num_layersself.lstm = nn.LSTM(input_size, hidden_size, num_layers, batch_first=True)self.fc = nn.Linear(hidden_size, 1) # 1 表示預測輸出變量為1def forward(self, x):h0 = torch.zeros(self.num_layers, x.size(0), self.hidden_size)c0 = torch.zeros(self.num_layers, x.size(0), self.hidden_size)out, _ = self.lstm(x, (h0, c0))out = self.fc(out[:, -1, :])return out # out 形狀為(batch_size,1)
-
input_size=1
:輸入特征的維度,適用于單變量時間序列。 -
hidden_size=50
:LSTM 隱藏層的維度,決定了模型的記憶能力。 -
num_layers=2
:堆疊的 LSTM 層數,增加層數可以提升模型的表達能力。 -
batch_first=True
:指定輸入和輸出的張量形狀為(batch_size, seq_len, input_size)
。 -
self.fc
:一個全連接層,將 LSTM 的輸出映射到最終的預測值。 -
batch_size 表示批次、seq_len 表示窗口大小、input_size 表示輸入尺寸,單變量輸入為1 ,多變量要基于個數變化
-
初始化隱藏狀態和細胞狀態:
-
h0
和c0
分別表示初始的隱藏狀態和細胞狀態,形狀為(num_layers, batch_size, hidden_size)
。 -
在每次前向傳播時,初始化為零張量。
-
-
LSTM 層處理:
-
self.lstm(x, (h0, c0))
:將輸入x
和初始狀態傳入 LSTM 層,輸出out
和新的狀態。 -
out
的形狀為(batch_size, seq_len, hidden_size)
,包含了每個時間步的輸出。
-
-
全連接層映射:
-
out[:, -1, :]
:提取序列中最后一個時間步的輸出。 -
self.fc(...)
:將提取的輸出通過全連接層,得到最終的預測結果。
-