基于Pytroch的lstm代码详解
时间: 2024-06-11 13:09:08 浏览: 179
基于pytorch的lstm参数使用详解
5星 · 资源好评率100%
LSTM(长短期记忆)是一种适用于序列数据的深度学习模型。它可以对序列中的长期依赖进行建模,并且在处理时序数据时表现出色。本篇文章将详细介绍基于Pytorch实现LSTM的代码。
首先,我们需要导入所需的库:
```python
import torch
import torch.nn as nn
```
接下来,我们定义一个LSTM模型类:
```python
class LSTM(nn.Module):
def __init__(self, input_size, hidden_size, num_layers, output_size):
super(LSTM, self).__init__()
self.hidden_size = hidden_size
self.num_layers = num_layers
self.lstm = nn.LSTM(input_size, hidden_size, num_layers, batch_first=True)
self.fc = nn.Linear(hidden_size, output_size)
def forward(self, x):
h0 = torch.zeros(self.num_layers, x.size(0), self.hidden_size).requires_grad_()
c0 = torch.zeros(self.num_layers, x.size(0), self.hidden_size).requires_grad_()
out, (hn, cn) = self.lstm(x, (h0.detach(), c0.detach()))
out = self.fc(out[:, -1, :])
return out
```
这里,我们定义了一个LSTM类,它继承了Pytorch的nn.Module类。LSTM类有四个参数:输入大小(input_size)、隐藏大小(hidden_size)、LSTM层数(num_layers)和输出大小(output_size)。在初始化函数中,我们定义了一个nn.LSTM层和一个nn.Linear层。nn.LSTM层接受输入和隐藏大小作为输入,并返回输出和最后的隐藏状态。我们使用nn.Linear层将LSTM的最后一个输出映射到所需的输出大小。
在前向函数中,我们首先定义了初始的隐藏状态h0和记忆状态c0。然后,我们将输入x和初始隐藏状态h0、记忆状态c0传递给nn.LSTM层,并获得输出out和最终隐藏状态hn、记忆状态cn。我们使用out[:, -1, :]来获取LSTM的最后一个输出。最后,我们将LSTM的最后一个输出传递给nn.Linear层,并返回输出。
接下来,我们可以实例化LSTM类并定义一些超参数:
```python
input_size = 28
hidden_size = 128
num_layers = 2
output_size = 10
learning_rate = 0.001
```
在这里,我们定义了输入大小为28(MNIST数据集中的图像大小为28x28),隐藏大小为128,LSTM层数为2,输出大小为10(MNIST数据集中的类别数为10),学习率为0.001。
接下来,我们可以加载MNIST数据集并定义一个训练函数:
```python
train_dataset = torchvision.datasets.MNIST(root='./data', train=True, transform=transforms.ToTensor(), download=True)
test_dataset = torchvision.datasets.MNIST(root='./data', train=False, transform=transforms.ToTensor())
train_loader = torch.utils.data.DataLoader(dataset=train_dataset, batch_size=100, shuffle=True)
test_loader = torch.utils.data.DataLoader(dataset=test_dataset, batch_size=100, shuffle=False)
model = LSTM(input_size, hidden_size, num_layers, output_size)
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)
def train(model, train_loader, criterion, optimizer):
for epoch in range(num_epochs):
for i, (images, labels) in enumerate(train_loader):
images = images.view(-1, sequence_length, input_size)
labels = labels
optimizer.zero_grad()
outputs = model(images)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
if (i+1) % 100 == 0:
print('Epoch [{}/{}], Step [{}/{}], Loss: {:.4f}'.format(epoch+1, num_epochs, i+1, len(train_loader), loss.item()))
```
在这里,我们使用Pytorch内置的MNIST数据集来加载数据。我们使用torch.utils.data.DataLoader来创建数据加载器。我们实例化了我们之前定义的LSTM模型,并定义了损失函数和优化器。在训练函数中,我们使用for循环来迭代训练数据集。我们将输入图像reshape为(batch_size,sequence_length,input_size)的形状。然后,我们将标签传递给模型并计算输出。我们使用损失函数计算损失,并使用反向传播和优化器来更新模型参数。最后,我们打印出训练损失。
最后,我们可以定义一个测试函数来测试模型的性能:
```python
def test(model, test_loader):
with torch.no_grad():
correct = 0
total = 0
for images, labels in test_loader:
images = images.view(-1, sequence_length, input_size)
labels = labels
outputs = model(images)
_, predicted = torch.max(outputs.data, 1)
total += labels.size(0)
correct += (predicted == labels).sum().item()
print('Accuracy of the model on the 10000 test images: {} %'.format(100 * correct / total))
```
在这里,我们使用with torch.no_grad()上下文管理器来关闭梯度计算。我们使用for循环迭代测试数据集,并将输入图像reshape为(batch_size,sequence_length,input_size)的形状。然后,我们将标签传递给模型并计算输出。我们使用torch.max函数来获取每个输出张量中的最大值,并返回一个元组(值,索引)。我们使用索引作为预测值,并将其与真实标签进行比较。最后,我们打印出测试准确率。
最后,我们可以训练和测试我们的LSTM模型:
```python
num_epochs = 2
sequence_length = 28
train(model, train_loader, criterion, optimizer)
test(model, test_loader)
```
在这里,我们定义了训练周期数为2,序列长度为28。我们使用train函数来训练模型,并使用test函数来测试模型的性能。
这就是基于Pytorch实现LSTM的详细说明。在实际应用中,您可以使用此代码作为基础,并根据需要进行修改。
阅读全文