第一章 python训练线性模型实战
第二章 python训练决策树模型实战
第三章 python训练神经网络模型实战
第四章 python训练支持向量机模型实战
第五章 python训练贝叶斯分类器模型实战
第六章 python训练集成学习模型实战
第七章 python训练聚类模型实战
第八章 python训练KNN模型实战
第九章 python训练CNN模型实战
第十章 python训练RNN模型实战
......(会一直更新)
目录
机器学习实战目录
第十章 python训练RNN模型实战
1. 准备数据集
2. 定义 RNN 模型
3. 定义损失函数和优化器
4. 训练模型
5. 测试模型
完整代码如下所示:
参考资料:
训练 RNN 模型的具体步骤如下:
在这里我们使用 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)
```
在本例中,我们定义了一个简单的基于 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()
```
在本例中,我们使用交叉熵作为损失函数,并使用随机梯度下降 (SGD) 优化器进行模型训练。
```python
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(model.parameters(), lr=0.01, momentum=0.9)
```
训练 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
```
在测试集上测试 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)]
大家觉得有帮助的话还请大家给个收藏关注鼓励一下,有什么问题评论区留言,看到会恢复哒~