【免费下载链接】internimage_h_jointto22k_384
InternImage(internimage_h_jointto22k_384)是 OpenGVLab 推出的 1.08B 参数视觉大模型,其 config.json 文件定义了网络深度、DCNv3 分组数和 21841 类分类头。本文逐行解读这份 InternImage 配置参数,带你一次看懂 depths、groups 和 21841 类的含义。
📄 快速上手:config.json 是什么
在 Hugging Facetransformers体系中,加载模型前会先读取config.json,把网络结构"按图施工"地搭建出来。本仓库的三个关键文件各司其职:
- config.json —— 网络结构的全部超参数
- configuration_internimage.py —— 参数对应的 Python 类
InternImageConfig,带默认值 - modeling_internimage.py —— 真正消费这些参数、搭建网络的主干代码
_name_or_path字段写着模型名,auto_map则告诉框架"自定义类在哪个文件":
"auto_map": { "AutoConfig": "configuration_internimage.InternImageConfig", "AutoModel": "modeling_internimage.InternImageModel", "AutoModelForImageClassification": "modeling_internimage.InternImageModelForImageClassification" }也就是说,用AutoModel.from_pretrained(..., trust_remote_code=True)加载时,AutoModel得到的是不带分类头的纯主干(内部强制num_classes=0),而AutoModelForImageClassification才会接上 21841 类的分类头(见 modeling_internimage.py)。
🗂️ 参数速查总表
| 参数 | 值 | 作用一句话 |
|---|---|---|
channels | 320 | 第一阶段的特征图通道数,后续阶段依次翻倍 |
depths | [6, 6, 32, 6] | 4 个阶段各自堆叠的 block 数量 |
groups | [10, 20, 40, 80] | 各阶段 DCNv3 的分组数(可变形卷积的注意力头数) |
dw_kernel_size | 5 | 生成偏移量/权重前用的深度卷积核大小(H/G 专用) |
mlp_ratio | 4.0 | MLP 隐层展宽倍率 |
num_classes | 21841 | 分类头输出的类别数 |
use_clip_projector | true | 启用 CLIP 风格的特征投影分类头(H/G 专用) |
core_op | "DCNv3" | 核心算子:第三代可变形卷积 |
drop_rate/drop_path_rate | 0.0 | 正则化强度(推理仓库中均为 0) |
torch_dtype | "float32" | 推理默认精度 |
🔢 depths:4 个阶段、50 个 block 怎么排布
"depths": [6, 6, 32, 6]表示网络分成4 个阶段(stage),每个阶段由若干个InternImageBlock串联。在 InternImageBlock 中,depth直接决定nn.ModuleList里创建多少个InternImageLayer:
self.blocks = nn.ModuleList([InternImageLayer(...) for i in range(depth)])| 阶段 | depths | 通道数 | 384px 输入下的特征图 |
|---|---|---|---|
| Stage 1 | 6 | 320 | 96 × 96 |
| Stage 2 | 6 | 640 | 48 × 48 |
| Stage 3 | 32 | 1280 | 24 × 24 |
| Stage 4 | 6 | 2560 | 12 × 12 |
两个细节值得注意:
- 通道数翻倍、分辨率减半:每个阶段末尾(最后阶段除外)有一个 DownsampleLayer,用 3×3、stride=2 卷积把特征图减半、通道翻倍。
num_features因此是channels × 2³ = 2560(modeling_internimage.py)。 - Stage 3 占了 32 个 block,是计算量的大头——深层语义理解主要靠它,这种"中间厚、两头薄"的布局与主流大模型一致。
🧩 groups:DCNv3 的"注意力头数",为什么是 10/20/40/80
"groups": [10, 20, 40, 80]传给 DCNv3 的group参数(dcnv3.py)。DCNv3 是 InternImage 的灵魂算子:每个像素动态预测一组偏移量(offset)和一组 softmax权重(mask),实现"注意力式的可变形采样"。groups 本质上就是这种采样注意力的头数。
它与通道数存在一条"必须整除"的硬约束(见 dcnv3.py):
if channels % group != 0: raise ValueError('channels must be divisible by group, but got {channels} and {group}')本配置恰好满足:
- 320 ÷ 10 =32、640 ÷ 20 =32、1280 ÷ 40 =32、2560 ÷ 80 =32
每个 head 分到 32 个通道——是 2 的幂次。源码里有一行注释专门解释了原因:CUDA 实现中每个 attention head 维度为 2 的幂更高效。这正是 groups 逐阶段翻倍、始终比通道数"慢一拍"的原因。
另外,groups也决定了偏移量的参数量:每个像素要输出group × kernel² × 2个 offset 和group × kernel²个 mask(dcnv3.py),所以 groups 越大,DCNv3 越"精打细算",但参数和计算也越多。
🎯 num_classes:21841 到底是什么?
"num_classes": 21841是这份配置最有"故事"的字段:
- 它是ImageNet-22k 的类别数(原始类别表约 21843 项,去掉第 0 位未使用类和缺失类后为 21841)。
- 模型名里的
jointto22k指的是 InternImage-H 先在内部 427M 数据集上联合预训练、再在IN-22K(ImageNet-22k)上继续预训练。 - 而仓库 README 中 README.md 标注的 90.1%+ Top-1 是在ImageNet-1K(1000 类子集)评测的结果——1K 的类正是 22k 类别的子集,所以同一个 21841 维的分类头天然兼容两种评测。
分类头长什么样?
对 H 这一档,use_clip_projector: true启用了专门的 CLIP 风格分类头(modeling_internimage.py):
- Stage 4 特征经 1×1 卷积 + PixelShuffle 投影到 1024 维;
- Stage 3 特征经 1×1 卷积后相加融合(多尺度信息);
- 过 AttentionPoolingBlock(16 头注意力池化)压到 768 维(CLIP 文本塔维度);
- 最后
Linear(768 → 21841)输出 logits。
"cls_scale": 1.5则用于非 CLIP 头的路径:把 1×1 卷积输出通道放大 1.5 倍(2560 × 1.5 = 3840),再送入分类层(modeling_internimage.py)。
🧠 核心算子组:core_op、dw_kernel_size、offset_scale
| 参数 | 值 | 解读 |
|---|---|---|
core_op | "DCNv3" | 指定核心算子;没装 CUDA 版 DCNv3 时自动回退到纯 PyTorch 实现(modeling_internimage.py) |
dw_kernel_size | 5 | H/G 专用:先用 5×5 深度卷积提特征,再算 offset/mask,感受野比 3×3 更大 |
offset_scale | 1.0 | 偏移量缩放系数,控制动态采样点的移动幅度 |
center_feature_scale | true | H/G 专用:动态融合"采样结果"与"中心像素投影",保留中心信息 |
remove_center | false | 采样时是否去掉中心点(要求卷积核为奇数) |
在 DCNv3.forward 中流程很直观:input_proj→ 深度卷积dw_conv→ 线性层出 offset/mask → 核心采样 → 可选的 center 融合 →output_proj。
📐 归一化策略:res_post_norm 与 level2_post_norm
这份配置里归一化参数看似平淡,实则藏着 H/G 模型特有的稳定性设计:
post_norm: false—— 使用标准的 pre-norm(先 norm 再过 DCNv3/MLP),见 InternImageLayer.forward。res_post_norm: true—— H/G 专用改进:在每个残差分支输出之后再加一层 LN(res_post_norm1/2),即x + norm(branch(x)),抑制深层特征幅值漂移。level2_post_norm: true+level2_post_norm_block_ids: [5, 11, 17, 23, 29]—— 只在 Stage 3(32 个 block)中,对每 6 个 block 的末尾各插一次额外 LN。5 个 id 对应第 6/12/18/24/30 个 block,恰好均匀切分 Stage 3(32 = 5×6 + 2)。这个开关在组网时只对第 2 级生效(modeling_internimage.py)。norm_layer: "LN"—— 全程 LayerNorm;act_layer: "GELU"—— 全程 GELU 激活。
🎲 正则化与推理开关
| 参数 | 值 | 说明 |
|---|---|---|
drop_rate | 0.0 | Dropout 率。源码默认是 0.2,本仓库为已训练完的推理权重,置 0 保证输出确定 |
drop_path_rate | 0.0 | Stochastic Depth(随机深度)率 |
drop_path_type | "linear" | Stochastic Depth 的分配方式:随深度线性递增(torch.linspace,modeling_internimage.py) |
with_cp | false | 是否用梯度检查点省显存;纯推理场景恒为 false |
torch_dtype | "float32" | 加载默认精度,可按需改为 bfloat16 等 |
transformers_version | "4.37.2" | 记录生成配置时的 transformers 版本,仅作兼容性参考 |
🖼️ 配套输入:preprocessor_config.json
模型"吃什么"也由 preprocessor_config.json 定义,这里全是 ImageNet 标准配方:
size: 384/crop_size: 384—— 与模型名中的384对应:先缩放到短边 384,再中心裁剪 384×384(对应 StemLayer 两次 stride=2,输出 96×96 进入 Stage 1)。image_mean: [0.485, 0.456, 0.406]/image_std: [0.229, 0.224, 0.225]—— ImageNet 经典归一化均值/标准差。resample: 3—— PIL 的双三次插值(BICUBIC)。feature_extractor_type: "CLIPFeatureExtractor"—— 直接复用 CLIP 的图像处理器,这也与use_clip_projector的 CLIP 血统一脉相承。
❓ 三个高频疑问
1. depths 和 groups 能改吗?参数层面可以任意填,但 model.safetensors 的权重是按当前配置训练的:改depths/groups/channels会导致权重形状对不上,加载直接报错。这套配置是为 1.08B 权重的 InternImage-H 量身定制的。
2. 为什么 groups 不是 [3, 6, 12, 24]?小模型(如 T/S/B)通道数少(64 起步),groups 小;H 的通道是 320 起步,为保持"每 head 32 通道且为 2 的幂"的 CUDA 高效布局,groups 相应放大到 10/20/40/80。
3. 21841 维 logits 想只测 1K 怎么办?ImageNet-1K 的 1000 类是 22k 类别的子集,取对应索引的 logits 即可评测;仓库 README 中 90.1% 的 Top-1 就是这么算出来的。
✅ 小结
一份 config.json 读完,InternImage-H 的骨架已尽览:320 通道起步、[6, 6, 32, 6] 的四级深浅布局、[10, 20, 40, 80] 的 DCNv3 分组、5 像素深度卷积、21841 类 CLIP 风格分类头、384px 输入。想进一步动手,推荐沿着 configuration_internimage.py → modeling_internimage.py → dcnv3.py 的顺序读源码,每行配置都能找到它落地的那几行 Python。
【免费下载链接】internimage_h_jointto22k_384
相关推荐
internimage_xl_22k_384的config.json全解读:depths、groups、layer_scale等20+参数逐个讲透
internimage_xl_22k_384的config.json全解读:depths、groups、layer_scale等20+参数逐个讲透 Intern
IN-22K与IN-1K预训练差异详解:internimage_l_22k_384的21841类分类头背后是什么
IN 22K与IN 1K预训练差异详解:internimage_l_22k_384的21841类分类头背后是什么 📌 一句话导读 : internimage_
逐行解读Mellum2-12B-A2.5B-Instruct-mxfp4的config.json:300行配置背后的模型真相
逐行解读Mellum2 12B A2.5B Instruct mxfp4的config.json:300行配置背后的模型真相 Mellum2 12B A2.5B
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考