请你编程实现一个卷积神经网络,并在手写字符识别数据 MNIST 上进行实验测试
时间: 2023-09-04 17:12:02 浏览: 170
卷积神经网络-使用Python实现的简单手写字识别卷积神经网络.zip
好的,我可以帮你完成这个任务。卷积神经网络(Convolutional Neural Network, CNN)是一种广泛应用于计算机视觉任务中的深度学习模型,其基本思想是通过卷积操作对图像特征进行提取,再通过池化操作进行降维和压缩,最终通过全连接层进行分类或回归等任务。
下面是一个简单的卷积神经网络的实现:
```python
import torch
import torch.nn as nn
import torch.optim as optim
import torchvision.datasets as datasets
import torchvision.transforms as transforms
from torch.utils.data import DataLoader
# 定义卷积神经网络模型
class CNN(nn.Module):
def __init__(self):
super(CNN, self).__init__()
self.conv1 = nn.Conv2d(1, 16, kernel_size=5, padding=2)
self.pool1 = nn.MaxPool2d(kernel_size=2)
self.conv2 = nn.Conv2d(16, 32, kernel_size=5, padding=2)
self.pool2 = nn.MaxPool2d(kernel_size=2)
self.fc1 = nn.Linear(32*7*7, 128)
self.fc2 = nn.Linear(128, 10)
def forward(self, x):
x = self.pool1(torch.relu(self.conv1(x)))
x = self.pool2(torch.relu(self.conv2(x)))
x = x.view(-1, 32*7*7)
x = torch.relu(self.fc1(x))
x = self.fc2(x)
return x
# 加载手写字符识别数据 MNIST
train_dataset = datasets.MNIST(root='data', train=True, transform=transforms.ToTensor(), download=True)
test_dataset = datasets.MNIST(root='data', train=False, transform=transforms.ToTensor(), download=True)
train_loader = DataLoader(train_dataset, batch_size=64, shuffle=True)
test_loader = DataLoader(test_dataset, batch_size=64, shuffle=False)
# 定义损失函数和优化器
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)
# 训练卷积神经网络模型
model = CNN()
for epoch in range(10):
running_loss = 0.0
for i, (inputs, labels) in enumerate(train_loader):
optimizer.zero_grad()
outputs = model(inputs)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
running_loss += loss.item()
if (i+1) % 100 == 0:
print('Epoch [%d/%d], Iter [%d/%d] Loss: %.4f' % (epoch+1, 10, i+1, len(train_loader), running_loss/100))
running_loss = 0.0
# 测试卷积神经网络模型
correct = 0
total = 0
with torch.no_grad():
for inputs, labels in test_loader:
outputs = model(inputs)
_, 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))
```
这个卷积神经网络模型包含了两个卷积层和两个全连接层,其中第一个卷积层包含16个5x5的卷积核,第二个卷积层包含32个5x5的卷积核。每个卷积层后面都跟有一个2x2的最大池化层。最终的全连接层将32x7x7的特征图展开成一个长度为128的向量,然后再通过一个输出层输出10个类别的概率分布。在训练过程中,使用了交叉熵损失函数和Adam优化器。在测试过程中,通过计算模型在测试集上的准确率来评估模型性能。
你可以将这段代码保存为一个.py文件,并在命令行中运行该文件,即可训练和测试卷积神经网络模型。
阅读全文