基于pytorch平台,利用MNIST数据集,选择一个典型卷积模型,构建自己的卷积模型,以分类的准确度和混淆矩阵为衡量指标,分析两个模型的分类精度。
时间: 2024-05-07 14:17:51 浏览: 110
基于Python实现卷积神经网络分类MNIST数据集【100011707】
5星 · 资源好评率100%
好的,我了解了你的问题。首先,我需要确认一下你是否已经熟悉了卷积神经网络和PyTorch的使用?如果你还不熟悉,我可以为你提供一些学习资源。
如果你已经准备好了,那么我们可以开始构建自己的卷积模型。在MNIST数据集上,我们可以使用LeNet-5模型进行分类任务,也可以使用更深的卷积神经网络,如ResNet、VGG等。这里我选择使用一个比较简单的卷积神经网络,其结构如下:
```python
import torch.nn as nn
class ConvNet(nn.Module):
def __init__(self):
super(ConvNet, self).__init__()
self.layer1 = nn.Sequential(
nn.Conv2d(1, 32, kernel_size=5, stride=1, padding=2),
nn.ReLU(),
nn.MaxPool2d(kernel_size=2, stride=2))
self.layer2 = nn.Sequential(
nn.Conv2d(32, 64, kernel_size=5, stride=1, padding=2),
nn.ReLU(),
nn.MaxPool2d(kernel_size=2, stride=2))
self.flatten = nn.Flatten()
self.fc1 = nn.Linear(7*7*64, 1024)
self.fc2 = nn.Linear(1024, 10)
def forward(self, x):
out = self.layer1(x)
out = self.layer2(out)
out = self.flatten(out)
out = self.fc1(out)
out = self.fc2(out)
return out
```
这个卷积神经网络包含两个卷积层和两个全连接层。我们使用ReLU激活函数和最大池化层来增加模型的非线性性。在最后一层全连接层中,我们使用Softmax函数进行多分类任务。
现在我们可以开始训练模型了。我们可以使用Adam优化器和交叉熵损失函数来训练模型,并在训练集和测试集上计算分类准确率和混淆矩阵。代码如下:
```python
import torch
import torchvision
from torchvision import transforms
from sklearn.metrics import confusion_matrix
import matplotlib.pyplot as plt
import numpy as np
# 定义超参数
num_epochs = 5
batch_size = 100
learning_rate = 0.001
# 加载MNIST数据集
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())
# 加载数据集到DataLoader
train_loader = torch.utils.data.DataLoader(dataset=train_dataset, batch_size=batch_size, shuffle=True)
test_loader = torch.utils.data.DataLoader(dataset=test_dataset, batch_size=batch_size, shuffle=False)
# 构建模型
model = ConvNet()
# 定义损失函数和优化器
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)
# 训练模型
total_step = len(train_loader)
for epoch in range(num_epochs):
for i, (images, labels) in enumerate(train_loader):
# 将数据加载到设备上
images = images.to(device)
labels = labels.to(device)
# 前向传播和计算损失函数
outputs = model(images)
loss = criterion(outputs, labels)
# 反向传播和优化
optimizer.zero_grad()
loss.backward()
optimizer.step()
# 输出训练过程信息
if (i+1) % 100 == 0:
print('Epoch [{}/{}], Step [{}/{}], Loss: {:.4f}'.format(epoch+1, num_epochs, i+1, total_step, loss.item()))
# 测试模型
model.eval()
with torch.no_grad():
correct = 0
total = 0
y_true = []
y_pred = []
for images, labels in test_loader:
# 将数据加载到设备上
images = images.to(device)
labels = labels.to(device)
# 前向传播和计算损失函数
outputs = model(images)
_, predicted = torch.max(outputs.data, 1)
total += labels.size(0)
correct += (predicted == labels).sum().item()
# 计算混淆矩阵
y_true += labels.cpu().numpy().tolist()
y_pred += predicted.cpu().numpy().tolist()
print('Test Accuracy of the model on the 10000 test images: {} %'.format(100 * correct / total))
# 计算混淆矩阵
confusion_mat = confusion_matrix(y_true, y_pred)
print(confusion_mat)
# 绘制混淆矩阵图
classes = np.arange(10)
fig, ax = plt.subplots()
im = ax.imshow(confusion_mat, cmap=plt.cm.Blues)
ax.figure.colorbar(im, ax=ax)
ax.set(xticks=np.arange(confusion_mat.shape[1]), yticks=np.arange(confusion_mat.shape[0]), xticklabels=classes, yticklabels=classes, title='Confusion Matrix', ylabel='True label', xlabel='Predicted label')
plt.setp(ax.get_xticklabels(), rotation=45, ha="right", rotation_mode="anchor")
fmt = '.2f' if normalize else 'd'
thresh = confusion_mat.max() / 2.
for i in range(confusion_mat.shape[0]):
for j in range(confusion_mat.shape[1]):
ax.text(j, i, format(confusion_mat[i, j], fmt), ha="center", va="center", color="white" if confusion_mat[i, j] > thresh else "black")
fig.tight_layout()
plt.show()
```
在训练和测试过程中,我们计算每个批次的损失函数,输出训练过程信息,并计算测试集上的分类准确率和混淆矩阵。最后,我们将混淆矩阵绘制成图表展示出来,以便更直观地了解两个模型的分类精度。
希望这个回答能够帮到你,如果你有任何问题,欢迎随时问我!
阅读全文