RESNET101模型MNIST
时间: 2025-05-02 17:50:57 浏览: 18
### 使用ResNet101模型处理MNIST数据集
#### 数据预处理与加载
为了使用ResNet101模型训练或测试MNIST数据集,首先需要对MNIST数据进行适当的预处理。由于ResNet通常用于较大尺寸的图像分类任务(如ImageNet),而MNIST中的图像是28×28的小型灰度图像,因此需要调整输入大小以适应ResNet的要求。
可以通过`torchvision.transforms.Resize()`方法将MNIST图像缩放到适合ResNet的标准输入尺寸(通常是224×224)。此外,还需要将灰度图像转换为三通道图像,因为ResNet默认接受RGB图像作为输入[^1]。
以下是数据预处理和加载的代码示例:
```python
import torch
from torchvision import datasets, transforms
transform = transforms.Compose([
transforms.Resize((224, 224)), # 调整图像大小到224x224
transforms.Grayscale(num_output_channels=3), # 将单通道灰度图像转为三通道
transforms.ToTensor(), # 转换为张量
transforms.Normalize(mean=[0.5, 0.5, 0.5], std=[0.5, 0.5, 0.5]) # 归一化
])
train_dataset = datasets.MNIST(root='./data', train=True, transform=transform, download=True)
test_dataset = datasets.MNIST(root='./data', train=False, transform=transform)
train_loader = torch.utils.data.DataLoader(dataset=train_dataset, batch_size=64, shuffle=True)
test_loader = torch.utils.data.DataLoader(dataset=test_dataset, batch_size=64, shuffle=False)
```
#### 构建ResNet101模型
可以利用PyTorch内置的`torchvision.models.resnet101`模块快速构建ResNet101模型。需要注意的是,默认情况下该模型适用于具有1000类别的ImageNet数据集,因此需要修改最后一层全连接层以适配MNIST的10类别输出。
以下是模型定义的代码示例:
```python
import torchvision.models as models
resnet101 = models.resnet101(pretrained=False) # 不加载预训练权重
num_ftrs = resnet101.fc.in_features # 获取最后全连接层的输入特征数
resnet101.fc = torch.nn.Linear(num_ftrs, 10) # 修改全连接层以匹配MNIST的10个类别
```
#### 训练过程
训练过程中需要指定损失函数、优化器以及学习率调度策略。对于分类任务,常用的损失函数是交叉熵损失(CrossEntropyLoss)。可以选择Adam优化器或其他合适的优化算法。
以下是完整的训练循环代码示例:
```python
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
resnet101.to(device)
criterion = torch.nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(resnet101.parameters(), lr=0.001)
def train_model(model, criterion, optimizer, num_epochs=10):
model.train()
for epoch in range(num_epochs):
running_loss = 0.0
correct_predictions = 0
total_samples = 0
for images, labels in train_loader:
images, labels = images.to(device), labels.to(device)
optimizer.zero_grad()
outputs = model(images)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
_, predicted = torch.max(outputs, 1)
total_samples += labels.size(0)
correct_predictions += (predicted == labels).sum().item()
running_loss += loss.item()
accuracy = 100 * correct_predictions / total_samples
print(f"Epoch [{epoch+1}/{num_epochs}], Loss: {running_loss/len(train_loader):.4f}, Accuracy: {accuracy:.2f}%")
train_model(resnet101, criterion, optimizer, num_epochs=5)
```
#### 测试过程
完成训练后,可以在测试集上评估模型性能。通过计算预测标签与真实标签的一致性比例来衡量模型准确性。
以下是测试代码示例:
```python
def test_model(model, data_loader):
model.eval()
with torch.no_grad():
correct = 0
total = 0
for images, labels in data_loader:
images, labels = images.to(device), labels.to(device)
outputs = model(images)
_, predicted = torch.max(outputs.data, 1)
total += labels.size(0)
correct += (predicted == labels).sum().item()
accuracy = 100 * correct / total
print(f'Test Accuracy of the model on the 10000 test images: {accuracy:.2f}%')
test_model(resnet101, test_loader)
```
---
阅读全文
相关推荐


















