第3章思考题

更新时间: 试题数量: 购买人数: 提供作者:

有效期: 个月

章节介绍: 共有个章节

收藏
搜索
题库预览
MNIST数据集保存在程序所在目录的‘MNIST’文件夹中。要求:使用PyTorch实现一个简易卷积神经网络,对MNIST手写数字数据集进行分类。具体要求如下: (1) 网络结构包含:2个卷积层(第一层输出通道16,第二层输出通道32,均使用3x3卷积核)、2个池化层(2x2最大池化)、1个全连接层(输出10类); (2) 训练过程需包含:数据加载与预处理(归一化)、损失函数(交叉熵)、优化器(Adam,学习率0.001); (3) 训练10个epoch,每轮输出训练损失与准确率,并在测试集上输出最终分类准确率; (4) 保存训练好的模型参数为“mnist_cnn.pth”。 提示: (1) MNIST数据集可通过torchvision.datasets加载,使用DataLoader批量处理。 (2) 卷积层后建议添加ReLU激活函数。 【参考代码】 import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import DataLoader from torchvision import datasets, transforms # 数据预处理 transform = transforms.Compose([ transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,)) ]) # 加载数据集 train_dataset = datasets.MNIST(root='MNIST', train=True, download=True, transform=transform) test_dataset = datasets.MNIST(root='MNIST', train=False, download=True, transform=transform) train_loader = DataLoader( train_dataset, batch_size=64, shuffle=True ) test_loader = DataLoader( test_dataset, batch_size=1000, shuffle=False ) # 定义CNN模型 class SimpleCNN(nn.Module): def __init__(self): super(SimpleCNN, self).__init__() self.conv1 = nn.Conv2d(1, 16, kernel_size=3, padding=1) self.pool1 = nn.MaxPool2d(2, 2) self.conv2 = nn.Conv2d(16, 32, kernel_size=3, padding=1) self.pool2 = nn.MaxPool2d(2, 2) self.fc = nn.Linear(32*7*7, 10) def forward(self, x): x = torch.relu(self.conv1(x)) x = self.pool1(x) x = torch.relu(self.conv2(x)) x = self.pool2(x) x = x.view(-1, 32*7*7) x = self.fc(x) return x model = SimpleCNN() criterion = nn.CrossEntropyLoss() optimizer = optim.Adam(model.parameters(), lr=0.001) # 训练过程 for epoch in range(10): model.train() running_loss = 0.0 correct = 0 total = 0 for images, labels in train_loader: optimizer.zero_grad() outputs = model(images) loss = criterion(outputs, labels) loss.backward() optimizer.step() running_loss += loss.item() _, predicted = torch.max(outputs.data, 1) total += labels.size(0) correct += (predicted == labels).sum().item() print(f"Epoch {epoch+1}, Loss: {running_loss/len(train_loader):.4f}, Accuracy: {100.*correct/total:.2f}%") # 测试集评估 model.eval() correct = 0 total = 0 with torch.no_grad(): for images, labels in test_loader: outputs = model(images) _, predicted = torch.max(outputs.data, 1) total += labels.size(0) correct += (predicted == labels).sum().item() print(f"Test Accuracy: {100.*correct/total:.2f}%") # 保存模型 torch.save(model.state_dict(), 'mnist_cnn.pth')【缺少答案,请补充】