新闻中心
ConvNeXt飞桨版本预训练权重
本项目提供了ConvNeXt的飞桨版本的预训练权重以及模型文件。权重由PyTorch转换而来。并且通过在ImageNet 1K测试集进行精度校验。模型文件请见ConvNeXt.py。本项目旨在提供飞桨版本的模型权重、模型文件和验证精度,对于模型的理解并没有描述,如果想深入了解模型,请见: ConvNeXt:探索CNN网络的极限潜力
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜

项目简介
本项目提供了ConvNeXt的飞桨版本的预训练权重以及模型文件。权重由PyTorch转换而来。并且通过在ImageNet 1K测试集进行精度校验。模型文件请见ConvNeXt.py。本项目旨在提供飞桨版本的模型权重、模型文件和验证精度,对于模型的理解并没有描述,如果想深入了解模型,请见: ConvNeXt:探索CNN网络的极限潜力
ConvNeXt
模型文件请见ConvNeXt.py, 下面说一下PyTorch模型转换PaddlePaddle模型的注意事项。
- 线性层PyTorch与PaddlePaddle的权重转换需要转置一下
- DropPath层需要自定义。我是参考了这篇文章 PiT:结合池化层的视觉 Transformer 网络
- PaddlePaddle在涉及维度的参数时,多用axis,PyTorch则是dim
- 有时需要自定义参数,PaddlePaddle的API在这里
- PaddlePaddle无permute,而是采用了transpose
- 其他简单的API映射请见这里
在这个py文件的第134和135行,给weight和bias乘了一个1,也就是没有做什么处理,这个是PyTorch的写法,PaddlePaddle的写法我还不会,麻烦知道的大佬回复一下。
权重
这里介绍一下本次精度验证的权重文件,总共有5个,分别代表了不同大小和版本的ConvNeXt。 首先来总览一下。
| name | resolution | acc@1 | #params | FLOPs |
|---|---|---|---|---|
| ConvNeXt-T | 224x224 | 82.1![]() |
28M | 4.5G |
| ConvNeXt-S | 224x224 | 83.1 | 50M | 8.7G |
| ConvNeXt-B | 224x224 | 83.8 | 89M | 15.4G |
| ConvNeXt-L | 224x224 | 84.3 | 198M | 34.4G |
| ConvNeXt-XL | 384x384 | 87.8 | 350M | 179.0G |
由于文件数量限制,这里只展示这5个不同版本,以及做精度验证。22K上的权重将放在其他数据集里在这里。这个项目用的数据集在ConvNeXt预训练模型PaddlePaddle版本里,欢迎大家下载使用。下面来做精度验证8!
美图云修
商业级AI影像处理工具
50
查看详情
精度验证
以下精度验证代码参考寂寞你快进去大佬的写法。
In [1]# 解压ImageNet 1K数据集!mkdir data/ILSVRC2012 !tar -xf ~/data/data68594/ILSVRC2012_img_val.tar -C ~/data/ILSVRC2012In [2]
import osimport cv2import numpy as npimport warningsimport paddleimport paddle.vision.transforms as Tfrom PIL import Image
warnings.filterwarnings('ignore')# 构建数据集class ILSVRC2012(paddle.io.Dataset):
def __init__(self, root, label_list, transform, backend='pil'):
self.transform = transform
self.root = root
self.label_list = label_list
self.backend = backend
self.load_datas() def load_datas(self):
self.imgs = []
self.labels = [] with open(self.label_list, 'r') as f: for line in f:
img, label = line[:-1].split(' ')
self.imgs.append(os.path.join(self.root, img))
self.labels.append(int(label)) def __getitem__(self, idx):
label = self.labels[idx]
image = self.imgs[idx] if self.backend=='cv2':
image = cv2.imread(image) else:
image = Image.open(image).convert('RGB')
image = self.transform(image) return image.astype('float32'), np.array(label).astype('int64') def __len__(self):
return len(self.imgs)
val_transforms = T.Compose([
T.Resize(int(224 / 0.96), interpolation='bicubic'),
T.CenterCrop(224),
T.ToTensor(),
T.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])
In [3]
# 配置模型from ConvNeXt import convnext_tiny, convnext_small, convnext_base, convnext_large, convnext_xlarge cvt_t = convnext_tiny() cvt_s = convnext_small() cvt_b = convnext_base() cvt_l = convnext_large() cvt_x = convnext_xlarge()
W0211 21:12:49.976547 686 device_context.cc:447] Please NOTE: device: 0, GPU Compute Capability: 7.0, Driver API Version: 10.1, Runtime API Version: 10.1 W0211 21:12:49.982038 686 device_context.cc:465] device: 0, cuDNN Version: 7.6.In [4]
cvt_t.load_dict(paddle.load('data/data127804/convnext_tiny_1k_224_ema.pdparams'))
cvt_t = paddle.Model(cvt_t)
cvt_t.prepare(metrics=paddle.metric.Accuracy(topk=(1, 5)))
cvt_s.load_dict(paddle.load('data/data127804/convnext_small_1k_224_ema.pdparams'))
cvt_s = paddle.Model(cvt_s)
cvt_s.prepare(metrics=paddle.metric.Accuracy(topk=(1, 5)))
cvt_b.load_dict(paddle.load('data/data127804/convnext_base_1k_224_ema.pdparams'))
cvt_b = paddle.Model(cvt_b)
cvt_b.prepare(metrics=paddle.metric.Accuracy(topk=(1, 5)))
cvt_l.load_dict(paddle.load('data/data127804/convnext_large_1k_224_ema.pdparams'))
cvt_l = paddle.Model(cvt_l)
cvt_l.prepare(metrics=paddle.metric.Accuracy(topk=(1, 5)))
cvt_x.load_dict(paddle.load('data/data127804/convnext_xlarge_22k_1k_384_ema.pdparams'))
cvt_x = paddle.Model(cvt_x)
cvt_x.prepare(metrics=paddle.metric.Accuracy(topk=(1, 5)))
In [5]
val_dataset = ILSVRC2012('data/ILSVRC2012', transform=val_transforms, label_list='data/data68594/val_list.txt', backend='pil')# 模型验证acc = cvt_t.evaluate(val_dataset, batch_size=128, num_workers=0, verbose=1)print(acc)
Eval begin...
step 391/391 [==============================] - acc_top1: 0.8199 - acc_top5: 0.9588 - 1s/step
Eval samples: 50000
{'acc_top1': 0.81992, 'acc_top5': 0.9588}
In [6]
val_dataset = ILSVRC2012('data/ILSVRC2012', transform=val_transforms, label_list='data/data68594/val_list.txt', backend='pil')# 模型验证acc = cvt_s.evaluate(val_dataset, batch_size=128, num_workers=0, verbose=1)print(acc)
Eval begin...
step 391/391 [==============================] - acc_top1: 0.8308 - acc_top5: 0.9652 - 1s/step
Eval samples: 50000
{'acc_top1': 0.83078, 'acc_top5': 0.96516}
In [7]
val_dataset = ILSVRC2012('data/ILSVRC2012', transform=val_transforms, label_list='data/data68594/val_list.txt', backend='pil')# 模型验证acc = cvt_b.evaluate(val_dataset, batch_size=128, num_workers=0, verbose=1)print(acc)
Eval begin...
step 391/391 [==============================] - acc_top1: 0.8384 - acc_top5: 0.9683 - 2s/step
Eval samples: 50000
{'acc_top1': 0.8384, 'acc_top5': 0.9683}
In [7]
val_dataset = ILSVRC2012('data/ILSVRC2012', transform=val_transforms, label_list='data/data68594/val_list.txt', backend='pil')# 模型验证acc = cvt_l.evaluate(val_dataset, batch_size=128, num_workers=0, verbose=1)print(acc)
Eval begin...
step 391/391 [==============================] - acc_top1: 0.8435 - acc_top5: 0.9697 - 2s/step
Eval samples: 50000
{'acc_top1': 0.84346, 'acc_top5': 0.9697}
In [5]
# resize到384val384_transforms = T.Compose([
T.Resize((384, 384), interpolation='bicubic'), # T.CenterCrop(224),
T.ToTensor(),
T.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])
In [6]
val_dataset = ILSVRC2012('data/ILSVRC2012', transform=val384_transforms, label_list='data/data68594/val_list.txt', backend='pil')# 模型验证acc = cvt_x.evaluate(val_dataset, batch_size=128, num_workers=0, verbose=1)print(acc)
Eval begin...
step 391/391 [==============================] - acc_top1: 0.8775 - acc_top5: 0.9856 - 5s/step
Eval samples: 50000
{'acc_top1': 0.8775, 'acc_top5': 0.98556}
总结
部分模型的准确率有点点不一样是不能避免的,PyTorch转PaddlePaddle的过程或者数据处理的过程都会有一点点不一样。但是总的来说,并没有大的不同,所以模型转换是成功的。
ConvNeXt算是最强的卷积分类网络了。在现有Transformer统治的情况下,ConvNeXt仍然以极强的建模能力为卷积网络扳回一城。不过说实话,卷积比Transformer好的一点且无法代替的一点就是卷积的输入可以是任何尺度,Transformer则较为麻烦。
以上就是ConvNeXt飞桨版本预训练权重的详细内容,更多请关注其它相关文章!
# 自定义
# 石阡县营销推广中心地址
# 旅居养老营销推广策略
# 宝安网站建设哪家效益快
# 网站怎么推广采购
# 甘肃网站建设完全教程
# 抖音投流量怎么投营销推广
# 营销网站推广的好处
# 民宿营销自媒体推广
# 网站建设人员叫什么
# 无锡企业网站建设方法
# type
# 中文网
# 一台
# 腾讯
# 而来
# 在这里
# 明基
# 大佬
# 美图
# 请见
相关栏目:
【
行业资讯67740 】
【
技术百科0 】
【
网络运营39195 】
相关推荐:
如何创建解压文件命令
如何在命令提示符播放音频
如何给电脑加装固态硬盘
夸克转存中是什么意思
ip dhcp是什么意思
hp固态硬盘如何安装
新网站如何填写域名解析
单片机怎么计算0xf0
春运哪天抢票最好
营收和gmv区别_营收和gmv有什么区别
命令行如何启动应用程序
typescript能干什么
固态硬盘如何查看盘符
征信信誉不好如何恢复 如何修复不良征信方法
路由器power灯一直亮是什么意思
一天多少分钟
typescript入门要多久
锤子手机怎么不出5g
iPhone无法打开YouTube原因分析与解决方案
酷狗音乐pc版的每日推荐在哪 酷狗音乐PC版每日推荐查找指南
电动车充电器上的power是什么意思
单片机蓝牙怎么开启设备
苹果16配置参数有哪些
如何使硬盘升级固态硬盘
苹果16系统有哪些缺陷
excel中datediff函数怎么用
怎么下载360桌面壁纸
j*a中如何创建列表数组
笔记本电脑多少钱
为什么夸克没有动漫
市盈率3.2是什么意思
苹果16如何预购
J*a数组静态怎么打
make命令如何使用
春运抢票要用抢票软件吗
单片机怎么连接电路图
市盈率和市净率是什么意思
如何检测固态硬盘温度
市盈率ttm是什么意思
如何判断固态硬盘端口
如何安装大华固态硬盘
夸克还原排版是什么意思
空调power灯一直闪是什么意思
j*a map数组怎么取值
单片机怎么发送can 信号
苹果16主打颜色有哪些
j*a怎么求数组均值
如何安装固态硬盘win10
如何查看网站域名解析
typescript怎么写多个构造方法


2025-07-28
浏览次数:次
返回列表