用 PyTorch 搭建前馈神经网络,完成对手写数字数据集 MNIST 的分类。 参考流程: 1. 构造 MNIST 数据集的 DataSet 对象。 (1) 下载作业附件 mnist_train.csv 和 mnist_test.csv,自行编程实现 DataSet 类。 2. 根据已构造的 DataSet 实现 DataLoader。 3. 用 PyTorch 框架搭建前馈神经网络。 4. 训练模型并测试模型效果
时间: 2024-02-12 09:07:47 浏览: 95
以下是 PyTorch 搭建前馈神经网络完成 MNIST 数据集分类的代码实现:
```python
import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import Dataset, DataLoader
import pandas as pd
import numpy as np
# 定义 DataSet 类
class MNISTDataset(Dataset):
def __init__(self, csv_file):
self.data = pd.read_csv(csv_file, header=None).values.astype('float32')
self.labels = self.data[:, 0]
self.data = self.data[:, 1:]
def __len__(self):
return len(self.labels)
def __getitem__(self, idx):
label = self.labels[idx]
img = self.data[idx, :]
img = np.reshape(img, (28, 28))
return img, label
# 定义 DataLoader
train_dataset = MNISTDataset('mnist_train.csv')
test_dataset = MNISTDataset('mnist_test.csv')
train_dataloader = DataLoader(train_dataset, batch_size=32, shuffle=True)
test_dataloader = DataLoader(test_dataset, batch_size=32, shuffle=False)
# 定义前馈神经网络
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.fc1 = nn.Linear(28*28, 128)
self.fc2 = nn.Linear(128, 64)
self.fc3 = nn.Linear(64, 10)
self.relu = nn.ReLU()
def forward(self, x):
x = x.view(-1, 28*28)
x = self.relu(self.fc1(x))
x = self.relu(self.fc2(x))
x = self.fc3(x)
return x
# 定义损失函数和优化器
net = Net()
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(net.parameters(), lr=0.001)
# 训练模型
for epoch in range(10):
running_loss = 0.0
for i, data in enumerate(train_dataloader, 0):
inputs, labels = data
optimizer.zero_grad()
outputs = net(inputs)
loss = criterion(outputs, labels.long())
loss.backward()
optimizer.step()
running_loss += loss.item()
if i % 100 == 99:
print('[%d, %5d] loss: %.3f' % (epoch+1, i+1, running_loss/100))
running_loss = 0.0
# 测试模型
correct = 0
total = 0
with torch.no_grad():
for data in test_dataloader:
inputs, labels = data
outputs = net(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))
```
在训练过程中,我们将损失值打印出来,以便观察模型的训练效果。在测试过程中,我们计算模型的分类准确率。这份代码实现了对 MNIST 数据集的分类,可以作为 PyTorch 前馈神经网络的示例代码。
阅读全文