CIFAR-10 resnet18 炼丹指南

通过调整训练策略,如增加数据增强、优化超参数,成功将ResNet18在32*32图片上的准确率从58%提升至84%。详细介绍了如何解决过拟合问题,及多卡训练时的参数保存技巧。

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

  • 使用预训练模型,Adam,learning rate 1e-4,效果不好,不过也可能是我不够耐心
  • Adam, learning rate 1e-5 40个epoch后loss是0.1,之后在0.9附近振荡,test acc只有58%
  • 可能是没什么耐心,看网上都是几百个epoch而我看了几个epoch就想换了
  • 发现了效果不好的原因,当loss从2下降到0.1后准确率仍然只有58%,认为是resnet18在32*32的图片上过拟合导致的,于是发现train的transform不够正则,所以增加了flip和crop,然后在服务器上使用adam优化器,1e-4的学习率,大约在50个epoch后就达到了80%的准确率,继续训练下去还能接着下降,因为此时loss还没有完全收敛,但是由于我的目的并不需要那么严格的准确率,训练到84%的准确率就停止了
  • 另外,在服务器上用多卡训练保存参数时发现会在state_dict里面包上一层module,在这个blog里找到了解决方案
### CIFAR-10 数据集上的 ResNet 实现与应用 ResNet(残差网络)是一种用于解决深层神经网络训练困难的有效架构,在多个计算机视觉任务中表现出色。对于像 CIFAR-10 这样的小型图像分类数据集,ResNet 同样可以取得很好的效果。 #### 使用 ResNetCIFAR-10 的实现细节 为了在 CIFAR-10 上使用 ResNet 模型,通常会采用较小版本的 ResNet 架构来适应该数据集的特点: - **输入尺寸调整**:由于 CIFAR-10 图片分辨率较低(32×32),因此不需要非常深或者复杂的模型结构。一般会选择较浅层数目的 ResNet 版本,比如 ResNet-20 或者 ResNet-32[^1]。 - **预处理操作**:常见的做法是对原始图片做标准化处理,并可能加入一些简单的增强手段如随机裁剪、水平翻转等以增加样本多样性。 - **优化器配置**:大多数情况下选用 SGD 作为优化算法,并配合 Momentum 和权重衰减参数调节;学习率则按照预定策略逐步降低。 下面给出一段基于 PyTorch 平台构建并训练 ResNet 模型于 CIFAR-10 数据集上的简单代码示例: ```python import torch from torchvision import datasets, transforms from torch.utils.data import DataLoader import torch.nn as nn import torch.optim as optim from models.resnet_cifar import resnet20 # 假设有一个定义好的resnet20函数 transform_train = transforms.Compose([ transforms.RandomCrop(32, padding=4), transforms.RandomHorizontalFlip(), transforms.ToTensor(), transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010)), ]) trainset = datasets.CIFAR10(root='./data', train=True, download=True, transform=transform_train) trainloader = DataLoader(trainset, batch_size=128, shuffle=True, num_workers=2) device = 'cuda' if torch.cuda.is_available() else 'cpu' model = resnet20().to(device) criterion = nn.CrossEntropyLoss() optimizer = optim.SGD(model.parameters(), lr=0.1, momentum=0.9, weight_decay=5e-4) for epoch in range(start_epoch, start_epoch + 200): model.train() running_loss = 0.0 for i, data in enumerate(trainloader, 0): inputs, labels = data[0].to(device), data[1].to(device) optimizer.zero_grad() outputs = model(inputs) loss = criterion(outputs, labels) loss.backward() optimizer.step() running_loss += loss.item() ``` 这段脚本展示了如何加载 CIFAR-10 训练集以及设置相应的转换方法,接着初始化了一个 ResNet-20 模型实例,并指定了损失函数和优化器。最后通过循环迭代完成整个训练流程的一部分逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值