机器学习实战目录
第一章 python训练线性模型实战
第二章 python训练决策树模型实战
第三章 python训练神经网络模型实战
第四章 python训练支持向量机模型实战
第五章 python训练贝叶斯分类器模型实战
第六章 python训练集成学习模型实战
第七章 python训练聚类模型实战
第八章 python训练KNN模型实战
第九章 python训练CNN模型实战
第十章 python训练RNN模型实战
......(会一直更新)
第十章 python训练RNN模型实战
目录
训练 RNN 模型的具体步骤如下:
1. 准备数据集
在这里我们使用 PyTorch 内置的 MNIST 手写数字数据集。可以使用以下代码来加载数据集:
```python
import torch
import torchvision.datasets as datasets
import torchvision.transforms as transforms
# 定义转换函数,将图像转换为张量并进行归一化
transform = transforms.Compose([
transforms.ToTensor(),
transforms.Normalize((0.1307,), (0.3081,))
])
# 下载数据集
train_data = datasets.MNIST(root='./data', train=True, download=True, transform=transform)
test_data = datasets.MNIST(root='./data', train=False, download=True, transform=transform)
# 将数据转换为 DataLoader 对象
train_loader = torch.utils.data.DataLoader(train_data, batch_size=64, shuffle=True)
test_loader = torch.utils.data.DataLoader(test_data, batch_size=64, shuffle=True)
```
2. 定义 RNN 模型
在本例中,我们定义了一个简单的基于 RNN 的分类模型。
```python
import torch.nn as nn
class RNN(nn.Module):
def __init__(self):
super(RNN, self).__init__()
self.rnn = nn.RNN(input_size=28, hidden_size=64, num_layers=1, batch_first=True)
self.fc = nn.Linear(64, 10)
def forward(self, x):
out, h = self.rnn(x, None)
out = self.fc(out[:, -1, :])
return out
# 创建模型实例
model = RNN()
```
3. 定义损失函数和优化器
在本例中,我们使用交叉熵作为损失函数,并使用随机梯度下降 (SGD) 优化器进行模型训练。
```python
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(model.parameters(), lr=0.01, momentum=0.9)
```
4. 训练模型
训练 RNN 模型的代码如下所示:
```python
# 进行模型训练
for epoch in range(10):
running_loss = 0
for i, (images, labels) in enumerate(train_loader):
images = images.view(-1, 28, 28)
# 将梯度清零
optimizer.zero_grad()
# 前向传播,反向传播,更新权重
outputs = model(images)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
# 打印统计信息
running_loss += loss.item()
if (i+1) % 100 == 0:
print("Epoch [{}/{}], Step [{}/{}] Loss: {:.4f}"
.format(epoch+1, 10, i+1, len(train_loader), running_loss/100))
running_loss = 0
```
5. 测试模型
在测试集上测试 RNN 模型并计算准确率。
```python
# 在测试集上测试网络
correct = 0
total = 0
with torch.no_grad():
for images, labels in test_loader:
images = images.view(-1, 28, 28)
outputs = model(images)
_, predicted = torch.max(outputs.data, 1)
total += labels.size(0)
correct += (predicted == labels).sum().item()
print('Accuracy of the network on the 10000 test images: %d %%' % (100 * correct / total))
```
完整代码如下所示:
```python
import torch
import torch.nn as nn
import torch.optim as optim
import torchvision.datasets as datasets
import torchvision.transforms as transforms
# 定义转换函数,将图像转换为张量并进行归一化
transform = transforms.Compose([
transforms.ToTensor(),
transforms.Normalize((0.1307,), (0.3081,))
])
# 下载数据集
train_data = datasets.MNIST(root='./data', train=True, download=True, transform=transform)
test_data = datasets.MNIST(root='./data', train=False, download=True, transform=transform)
# 将数据转换为 DataLoader 对象
train_loader = torch.utils.data.DataLoader(train_data, batch_size=64, shuffle=True)
test_loader = torch.utils.data.DataLoader(test_data, batch_size=64, shuffle=True)
class RNN(nn.Module):
def __init__(self):
super(RNN, self).__init__()
self.rnn = nn.RNN(input_size=28, hidden_size=64, num_layers=1, batch_first=True)
self.fc = nn.Linear(64, 10)
def forward(self, x):
out, h = self.rnn(x, None)
out = self.fc(out[:, -1, :])
return out
# 创建模型实例
model = RNN()
# 定义损失函数和优化器
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(model.parameters(), lr=0.01, momentum=0.9)
# 进行模型训练
for epoch in range(10):
running_loss = 0
for i, (images, labels) in enumerate(train_loader):
images = images.view(-1, 28, 28)
# 将梯度清零
optimizer.zero_grad()
# 前向传播,反向传播,更新权重
outputs = model(images)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
# 打印统计信息
running_loss += loss.item()
if (i+1) % 100 == 0:
print("Epoch [{}/{}], Step [{}/{}] Loss: {:.4f}"
.format(epoch+1, 10, i+1, len(train_loader), running_loss/100))
running_loss = 0
# 在测试集上测试网络
correct = 0
total = 0
with torch.no_grad():
for images, labels in test_loader:
images = images.view(-1, 28, 28)
outputs = model(images)
_, predicted = torch.max(outputs.data, 1)
total += labels.size(0)
correct += (predicted == labels).sum().item()
print('Accuracy of the network on the 10000 test images: %d %%' % (100 * correct / total))
```
参考资料:
[[1](https://zhuanlan.zhihu.com/p/30844905)] [[2](https://pytorch.org/docs/stable/torchvision/datasets.html)]
大家觉得有帮助的话还请大家给个收藏关注鼓励一下,有什么问题评论区留言,看到会恢复哒~