You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

适配输入形状(13,9,1)的胶囊网络参数调整请求及Conv2D维度报错解决

适配输入形状(13,9,1)的胶囊网络参数调整方案

你遇到的这个ValueError问题很典型——原始MNIST的胶囊网络参数是专门针对28x28的输入设计的,直接套用到(13,9,1)的输入上,会因为卷积核尺寸、步长和特征图尺寸不匹配,导致卷积后出现负维度,触发报错。下面是针对你的输入尺寸量身定制的参数调整建议:

1. 先解决卷积层的核心矛盾

错误日志里提到的primary_caps/Conv2D节点,是因为前置卷积后得到的(5,11,256)特征图,用9x9的卷积核+步长2+VALID padding计算时,输出维度为负。所以第一步要调整前置卷积和Primary Caps层的卷积参数:

  • 前置卷积层:把9x9的卷积核改成3x3或5x5,步长设为(1,1),并使用SAME padding,这样能保证卷积后的特征图尺寸不会骤降(比如(13,9,1)经过3x3+SAME+步长1的卷积后,输出还是(13,9,256))
  • Primary Caps卷积层:同样用3x3的卷积核,步长设为(2,2),用VALID padding,这样计算出来的特征图尺寸是(7,5, ...),完全合法,不会出现负维度

2. 胶囊层参数适配

根据调整后的卷积层输出,胶囊层的参数可以这样设置:

  • 主胶囊(Primary Caps):数量可以保留64,或者降为32减少计算量;胶囊向量维度保留16即可,也可以根据需求降到8
  • 次级胶囊(Secondary Caps):数量要和你的任务类别匹配(比如分类任务是10类就设10);向量维度可以保留16,比原始的32更轻量化,也足够捕捉特征
  • 动态路由迭代次数r:保留3就好,这个参数和输入尺寸无关

3. 损失函数超参数无需改动

原始的损失函数超参数是和胶囊网络的损失计算逻辑绑定的,和输入尺寸没关系,直接保留就行:

  • epsilon = 1e-7
  • m_plus = 0.9
  • m_minus = 0.1
  • lambda_ = 0.5
  • alpha = 0.0005

完整的适配参数示例

# 损失函数超参数(保持不变)
epsilon = 1e-7
m_plus = 0.9
m_minus = 0.1
lambda_ = 0.5
alpha = 0.0005
epochs = 10  # 建议比MNIST多训练几轮,输入尺寸小可能需要更多轮次收敛

# 网络结构参数(适配(13,9,1)输入)
params = {
    "no_of_conv_kernels": 256,  # 若计算资源紧张,可改为128
    "conv_kernel_size": 3,       # 替换原始9x9核,避免特征图骤缩
    "conv_strides": (1, 1),
    "conv_padding": "SAME",
    "no_of_primary_capsules": 64,
    "primary_capsule_vector": 16,
    "primary_conv_kernel_size": 3,
    "primary_conv_strides": (2, 2),
    "primary_conv_padding": "VALID",
    "no_of_secondary_capsules": 10,  # 替换为你的任务实际类别数
    "secondary_capsule_vector": 16,
    "r": 3,
}

额外小贴士

  • 如果一定要用更大的卷积核(比如5x5),提前用公式计算输出尺寸:输出尺寸 = (输入尺寸 - 核尺寸)/步长 + 1(VALID padding场景),确保结果是正整数
  • 训练时可以监控验证集的准确率,如果收敛慢,适当增加epochs或者调整学习率
  • 若模型过大导致训练慢,可进一步减少卷积核数量、胶囊向量维度,平衡性能和速度

内容的提问来源于stack exchange,提问作者Sharukh Shaikh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 10:42:47