【pytorch】使用迁移学习(resnet18)训练mnist数据集

预备知识

  • 自己搭建cnn模型训练mnist(不使用迁移学习)

https://blog.csdn.net/qq_42951560/article/details/109565625

  • pytorch官方的迁移学习教程(蚂蚁、蜜蜂分类)

https://blog.csdn.net/qq_42951560/article/details/109950786

学习目标

今天我们尝试在pytorch中使用迁移学习来训练mnist数据集。

如何迁移

预训练模型

迁移学习需要选择一个预训练模型,我们这个任务也不是特别大,选择resnet18就行了。

数据预处理

resnet18输入的CHW(3, 224, 224)

mnist数据集中单张图片CHW(1, 28, 28)

所以我们需要对mnist数据集做一下预处理:
在这里插入图片描述

# 预处理
my_transform = transforms.Compose([
        transforms.Resize((224, 224)),
        transforms.Grayscale(3),
        transforms.ToTensor(),
        transforms.Normalize((0.1307,0.1307,0.1307), (0.3081,0.3081,0.3081)),
    ])
# 训练集
train_file = datasets.MNIST(
    root='./dataset/',
    train=True,
    transform=my_transform
)
# 测试集
test_file = datasets.MNIST(
    root='./dataset/',
    train=False,
    transform=my_transform
)

pytorch中数据增强和图像处理的教程(torchvision.transforms)可以看我的这篇文章

改全连接层

resnet18是在imagenet上训练的,输出特征数是1000;而对于mnist来说,需要分10类,因此要改一下全连接层的输出。

model = models.resnet18(pretrained=True)
in_features = model.fc.in_features
model.fc = nn.Linear(in_features, 10)

调整学习率

之前设置的Adam的学习率是1e-3,现在使用了迁移学习,所以学习率调小一点,改为1e-4

训练结果

resnet18相较于普通的一两层卷积网络来说已经比较深了,并且mnsit数据集还是挺大的,总共有7万张图片。为了节省时间,我们使用7张GeForce GTX 1080 Ti来训练:

  • 数据并行(DataParallel)
EPOCH: 01/10 STEP: 67/67 LOSS: 0.0266 ACC: 0.9940 VAL-LOSS: 0.0246 VAL-ACC: 0.9938 TOTAL-TIME: 102
EPOCH: 02/10 STEP: 67/67 LOSS: 0.0141 ACC: 0.9973 VAL-LOSS: 0.0177 VAL-ACC: 0.9948 TOTAL-TIME: 80
EPOCH: 03/10 STEP: 67/67 LOSS: 0.0067 ACC: 0.9990 VAL-LOSS: 0.0147 VAL-ACC: 0.9958 TOTAL-TIME: 80
EPOCH: 04/10 STEP: 67/67 LOSS: 0.0042 ACC: 0.9995 VAL-LOSS: 0.0151 VAL-ACC: 0.9948 TOTAL-TIME: 80
EPOCH: 05/10 STEP: 67/67 LOSS: 0.0029 ACC: 0.9997 VAL-LOSS: 0.0143 VAL-ACC: 0.9955 TOTAL-TIME: 80
EPOCH: 06/10 STEP: 67/67 LOSS: 0.0019 ACC: 0.9999 VAL-LOSS: 0.0133 VAL-ACC: 0.9962 TOTAL-TIME: 80
EPOCH: 07/10 STEP: 67/67 LOSS: 0.0013 ACC: 1.0000 VAL-LOSS: 0.0132 VAL-ACC: 0.9963 TOTAL-TIME: 80
EPOCH: 08/10 STEP: 67/67 LOSS: 0.0008 ACC: 1.0000 VAL-LOSS: 0.0132 VAL-ACC: 0.9963 TOTAL-TIME: 79
EPOCH: 09/10 STEP: 67/67 LOSS: 0.0006 ACC: 1.0000 VAL-LOSS: 0.0122 VAL-ACC: 0.9962 TOTAL-TIME: 79
EPOCH: 10/10 STEP: 67/67 LOSS: 0.0005 ACC: 1.0000 VAL-LOSS: 0.0131 VAL-ACC: 0.9959 TOTAL-TIME: 79
| BEST-MODEL | EPOCH: 07/10 STEP: 67/67 LOSS: 0.0013 ACC: 1.0000 VAL-LOSS: 0.0132 VAL-ACC: 0.9963

训练10轮,最佳的模型出现在第7轮,最大准确率是0.9963。在这篇文章中,我们自己搭了两层的卷积,也训练了10轮,最大准确率是0.9923。准确率提高了0.0040,我们要知道测试集共有1万张图片,也就是多预测对了40张图片,已经提升很高。当然,因为网络变深了,所以训练花费的时间也就增加了。

引用参考

https://blog.csdn.net/qq_42951560/article/details/109950786

  • 19
    点赞
  • 68
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
PyTorch中,可以使用以下步骤实现从源域数据集提取样本到目标域并进行领域自适应: 1. 首先,需要准备源域数据集和目标域数据集,并使用PyTorch的DataLoader对数据集进行加载。 2. 接着,可以使用训练模型或Fine-tuning等方法对源域数据集进行训练,例如在ImageNet上预训练ResNet模型。 3. 在将模型应用于目标域数据集之前,需要进行领域自适应。其中一种方法是通过对目标域数据集进行一些预处理,例如数据增强和标准化,以便与源域数据集更加相似。 4. 另一种方法是使用领域自适应算法来调整模型,以便更好地适应目标域数据集。例如,可以使用PyTorch中的DANN(Domain-Adversarial Neural Network)和ADDA(Adversarial Discriminative Domain Adaptation)等算法。 以下是一个简单的示例代码,展示如何使用PyTorch实现领域自适应: ```python import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import DataLoader from torchvision.datasets import MNIST from torchvision import transforms from models import Net from utils import train, test from domain_adaptation import DANN # 加载源域数据集 source_dataset = MNIST(root='./data', train=True, download=True, transform=transforms.ToTensor()) source_loader = DataLoader(source_dataset, batch_size=64, shuffle=True, num_workers=4) # 加载目标域数据集 target_dataset = MNIST(root='./data', train=False, download=True, transform=transforms.ToTensor()) target_loader = DataLoader(target_dataset, batch_size=64, shuffle=False, num_workers=4) # 定义模型 model = Net() # 定义损失函数和优化器 criterion = nn.CrossEntropyLoss() optimizer = optim.Adam(model.parameters(), lr=0.001) # 在源域数据集上进行训练 for epoch in range(10): train(model, source_loader, criterion, optimizer, epoch) # 使用DANN算法进行领域自适应 dann = DANN() dann.train(source_loader, target_loader, model, criterion, optimizer) # 在目标域数据集上进行测试 test(model, target_loader, criterion) ``` 其中,models.py和utils.py分别定义了模型训练/测试函数,domain_adaptation.py定义了DANN算法。通过以上代码,可以实现从源域数据集提取样本到目标域并进行领域自适应的过程。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Xavier Jiezou

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值