pytorch下的LSTM之后用全连接层分类的示例
时间: 2023-05-25 12:02:13 浏览: 246
以下是一个示例代码,它使用PyTorch中的LSTM模型对序列数据进行处理,并使用全连接层将其分类:
```python
import torch
import torch.nn as nn
# 定义LSTM模型
class LSTMClassifier(nn.Module):
def __init__(self, input_dim, hidden_dim, output_dim):
super().__init__()
self.hidden_dim = hidden_dim
self.lstm = nn.LSTM(input_dim, hidden_dim, batch_first=True)
self.fc = nn.Linear(hidden_dim, output_dim)
def forward(self, x):
# 初始化LSTM的隐状态和记忆
h0 = torch.zeros(1, x.size(0), self.hidden_dim).to(device)
c0 = torch.zeros(1, x.size(0), self.hidden_dim).to(device)
# LSTM前馈计算
out, _ = self.lstm(x, (h0, c0))
# 只需用最后一个时间步的输出传递到全连接层
out = self.fc(out[:, -1, :])
return out
# 定义数据和超参数
input_dim = 10
hidden_dim = 32
output_dim = 2
batch_size = 16
num_epochs = 10
learning_rate = 0.001
# 随机生成输入序列和标签
X = torch.randn(batch_size, 5, input_dim).to(device)
y = torch.LongTensor(batch_size).random_(0, output_dim).to(device)
# 定义模型,损失函数和优化器
model = LSTMClassifier(input_dim, hidden_dim, output_dim).to(device)
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)
# 训练模型
for epoch in range(num_epochs):
optimizer.zero_grad()
outputs = model(X)
loss = criterion(outputs, y)
loss.backward()
optimizer.step()
if (epoch+1) % 1 == 0:
print('Epoch [{}/{}], Loss: {:.4f}'.format(epoch+1, num_epochs, loss.item()))
# 用新的数据进行预测
X_new = torch.randn(1, 5, input_dim).to(device)
y_pred = model(X_new).argmax(dim=1)
print('Predicted label:', y_pred.item())
```
在此示例中,我们定义了一个LSTM分类器,其中输入序列的每个时间步长都有10个特征,输出标签为[0, 1]中的一个。我们首先定义了要使用的数据和超参数,然后定义了模型、损失函数和优化器。在训练模型时,我们向模型提供随机生成的输入序列和标签,并使用反向传播更新模型参数。最后,我们使用新的输入序列进行预测并输出预测结果。
阅读全文