mnist数据集使用resnet50预训练网络进行微调

该代码示例展示了如何在PyTorch中加载预训练的ResNet50模型,并修改其最后一层全连接层以适应10类分类任务。同时,对输入图像进行预处理,包括大小调整和归一化。模型的卷积层参数被固定,仅优化全连接层。在训练和测试过程中,计算了模型的准确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

加载预训练网络模型并加载权重
resnet50=torchvision.models.resnet50(weights=torchvision.models.ResNet50_Weights.DEFAULT)

in_features=resnet50.fc.in_features

# 将原resnet50网络中的最后一个全连接层改成10分类的输出
resnet50.fc=nn.Linear(in_features,10)
resnet50=resnet50.to(device)

因为resnet50网络需要输入224x224x3大小的图片
因此对网络接收的输入也要做相应的调整

tf=torchvision.transforms.Compose([

    torchvision.transforms.Resize(size=(224,224)),
    torchvision.transforms.Grayscale(num_output_channels=3),
    torchvision.transforms.ToTensor(),
    # torchvision.transforms.Normalize((0.1307,),(0.3081,))
    torchvision.transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
])
固定卷积层参数
# 固定卷积层的参数
optim=torch.optim.Adam(resnet50.fc.parameters(),lr=0.001)

完整代码:

import torch
import torchvision
from torch import nn
from torch.utils.data import DataLoader

tf=torchvision
### 基于ResNet50实现图像分类模型的微调 #### 数据集准备与加载 为了成功应用ResNet50进行图像分类,首先需要准备好数据集并将其加载到程序中。通常情况下,可以使用PyTorch或TensorFlow等框架来处理数据集。对于CIFAR-10这样的标准数据集,可以直接通过内置工具获取和预处理[^1]。 以下是使用PyTorch加载CIFAR-10数据集的一个简单示例: ```python import torch from torchvision import datasets, transforms transform = transforms.Compose([ transforms.Resize((224, 224)), # 将图像调整为适合ResNet50输入大小 transforms.ToTensor(), ]) train_dataset = datasets.CIFAR10(root='./data', train=True, download=True, transform=transform) test_dataset = datasets.CIFAR10(root='./data', train=False, download=True, transform=transform) train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=32, shuffle=True) test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=32, shuffle=False) ``` #### 构建ResNet50模型 接着,可以通过调用预训练ResNet50模型,并根据具体任务的需求修改其最后一层全连接层以适配新的类别数。如果目标是将ResNet50应用于其他特定领域(如蛋糕图像或多类别的宠物识别),则需替换默认的输出层以匹配新数据集的标签数量][^[^23]。 下面展示了一个基于PyTorch构建ResNet50模型的例子: ```python import torchvision.models as models num_classes = 10 # CIFAR-10有10个类别 model = models.resnet50(pretrained=True) # 替换最后的全连接层 in_features = model.fc.in_features model.fc = torch.nn.Linear(in_features, num_classes) ``` #### 定义优化器与损失函数 在完成上述操作后,还需要定义合适的优化算法以及损失计算方法以便后续训练过程能够顺利开展。常用的组合方式包括随机梯度下降(SGD)配合交叉熵作为主要评价指标之一[^4]。 这里给出一段关于配置这些组件的具体代码片段: ```python criterion = torch.nn.CrossEntropyLoss() optimizer = torch.optim.SGD(model.parameters(), lr=0.001, momentum=0.9) scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=7, gamma=0.1) ``` #### 训练与验证阶段 进入实际训练环节之前,请记得把整个流程封装成易于管理的形式;比如创建单独的方法分别负责单轮迭代内的前向传播、反向传播更新权重等工作逻辑。与此同时,在每一轮结束后统计测试集合上的表现情况从而决定何时停止或者保存最优版本权值文件。 以下是一段简化版的训练循环演示: ```python device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') model.to(device) best_acc = 0.0 for epoch in range(num_epochs): model.train() running_loss = 0.0 for inputs, labels in train_loader: inputs, labels = inputs.to(device), labels.to(device) optimizer.zero_grad() outputs = model(inputs) loss = criterion(outputs, labels) loss.backward() optimizer.step() running_loss += loss.item() scheduler.step() correct = 0 total = 0 with torch.no_grad(): model.eval() for inputs, labels in test_loader: inputs, labels = inputs.to(device), labels.to(device) outputs = model(inputs) _, predicted = torch.max(outputs.data, 1) total += labels.size(0) correct += (predicted == labels).sum().item() accuracy = correct / total if accuracy > best_acc: best_acc = accuracy torch.save(model.state_dict(), './BestCheckPoint/resnet50-best.pth') print(f"Best Accuracy: {best_acc}") ``` #### 结果分析与改进策略 经过一系列实验发现,原始ResNet50模型在某些条件下可能无法达到理想效果。此时可考虑进一步优化方案,例如增加正则化手段防止过拟合现象发生、尝试不同初始化技巧提高收敛速度或是探索更先进的迁移学习技术提升泛化能力等措施[^5]。 ---
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值