如何正确修改ConvNeXt预训练模型分类器层?解决norm_layer未定义问题
解决ConvNeXt预训练模型修改分类器时norm_layer未定义的问题
原问题中直接引用norm_layer报错,是因为该变量是ConvNeXt模型内部初始化时传入的归一化层类,并非全局可直接调用的对象。可通过两种方式解决:
方法一:复用原模型的归一化层类
从已加载的预训练模型中提取原分类器使用的归一化层类型,保证和原模型逻辑一致:
import torch import torch.nn as nn from torchvision.models import convnext_base # 加载预训练ConvNeXt-base模型 model = convnext_base(pretrained=True, stochastic_depth_prob=0.1, layer_scale=1e-4) # 获取原模型分类器中的归一化层类 norm_layer = model.classifier[0].__class__ # 替换为新的分类器 model.classifier = nn.Sequential( norm_layer(1024), nn.Flatten(1), nn.Linear(1024, 7) )
方法二:显式使用ConvNeXt默认的归一化层
ConvNeXt默认使用nn.LayerNorm作为归一化层,可直接显式调用:
import torch import torch.nn as nn from torchvision.models import convnext_base # 加载预训练ConvNeXt-base模型 model = convnext_base(pretrained=True, stochastic_depth_prob=0.1, layer_scale=1e-4) # 直接使用LayerNorm构建新分类器 model.classifier = nn.Sequential( nn.LayerNorm(1024), nn.Flatten(1), nn.Linear(1024, 7) )
两种方法对比:方法一更稳妥,适配所有ConvNeXt模型的归一化层设置;方法二更直观,适合确认模型默认归一化层的场景。
内容的提问来源于stack exchange,提问作者Omar El-Khashab
相关产品推荐
相关产品推荐

