写点什么

ResNet-50 在 ImageNet-1k 上的实验笔记

用户头像
毛显新
关注
发布于: 2 小时前

本文是关于 ResNet-50 在 ImageNet 上的实验研究,目前的话,实验数据集分别是 ImageNet-240 和 ImageNet-1k,其中前者是后者的一个子集。


接下来直接上实验结果吧,第一次实验,我是 freeze all layer exclude last layer,注意此处我加载了在 ImageNet-1k 上预训练的模型,实验结果是: train_acc = 93.8, val_acc = 93.44, test_acc = 93.48。


第二次实验(这一次实验加载的预训练模型是加载第一次保存下来的模型,原因是我们要在第一次训练完 last layer 参数的情况下做微调,而不是直接 unfreeze layer4 和 fc layer,这样会破坏预训练学习到的信息,这里还要提一下,微调的话,学习率最好是第一次训练的 1/10),我是 freeze all layer exclude layer4 and fc layer(也就是上面说的 last layer),实验结果是: train_acc = 95.24,val_acc = 93.6,test_acc = 93.7。对比第一次和第二次的实验结果,我们可以发现在 val 和 test 上获得了些许提升,但是从 train 可以看出开始过拟合了。


第三次实验(这一次实验加载的预训练模型是加载第一次保存下来的模型),我是 freeze all layer exclude layer3 and layer4 and fc layer,实验结果是: train_acc = 95.81, val_acc = 93.67, test_acc = 93.9,对比第三次实验和第一次实验,可以发现,unfreeze 更多的网络层数,能略微提升准确率,但是也不太多吧。


对于过拟合,我说说我的看法吧,加大数据量可以缓解过拟合,但也仅仅只是缓解,除非你的数据集包含了所有现实情况,不然这个无法避免,我们能做的只是缩小 train_acc 和 val_acc 之间的 gap。


最后再说一下在 ImageNet-1k 上的 acc = 87.43,对比 ImageNet-240 和 ImageNet-1k 上的结果,我们可以发现,模型在 ImageNet-1k 上做 pre-train,然后 transfer 到 ImageNet-240 上,可以明显提升模型效果,不过两者都是同属于一个 domain,我们需要更多的在不同 domain 上测试 transfer 的效果才行。


对于数据量和模型泛化性的研究,有一篇论文写的很好,Big Transfer (BiT): General Visual Representation Learning,该论文在 ImageNet-1k(1.28M 张图片),ImageNet-21k(14.2M 张图片),JFT-300M(300M 张图片),上分别实验,发现数据量越大,效果越好,可以在 papers with code 上的 benckmark 查到 ResNet-50 在 ImageNet-1k 上的 test_acc = 77.15,但是在 JFT-300M 上做预训练之后,再做 transfer 的话,可以达到 test_acc = 87.54。这里又不得不感慨,大力出奇迹,只是这次换成了数据集。。。。。


想了下,还是要放代码的,我这里放一下 train.py:


import torch
from utils.eval import calc_accfrom utils.utils import setup_seed, get_dataloader, show_img, predict_batch, set_gpufrom utils.model import define_model, define_optim, start_trainfrom torch import nn
# 设置哪块显卡可见device = set_gpu('0, 1')
# 设置随机数种子,使结果可复现setup_seed(20)
# 数据读取train_batch = 160test_batch = 160EPOCH = 200trainloader, testloader, classes = get_dataloader(train_batch, test_batch)
# 对训练集的一个batch图片进行展示show_img(trainloader, classes, batch_size=train_batch)
# 网络结构定义net = define_model(classes)net = nn.DataParallel(net)net.to(device)
# 定义优化器和损失函数criterion, optimizer = define_optim(net)net.load_state_dict(torch.load('resnetV1-50-9519-93.pth'))
# 开始模型训练start_train(net, EPOCH, trainloader, device, optimizer, criterion, testloader)
# 训练后在测试集上进行评测net.load_state_dict(torch.load('resnet50Cls.pth'))print(calc_acc(net, testloader, device))
# 进行模型预测predict_batch(net, testloader, classes, test_batch, device)
复制代码


完整代码的话,我放到 Github 了: https://github.com/MaoXianXin/PycharmProjects

用户头像

毛显新

关注

还未添加个人签名 2021.07.26 加入

还未添加个人简介

评论

发布
暂无评论
ResNet-50 在 ImageNet-1k 上的实验笔记