BatchNorm中running_mean与sample_mean维度不匹配问题排查
问题根源
你的错误核心是多个BatchNorm层共用了同一个bn_param字典,导致前一层的running_mean(维度(1,20))被后一层继承,而后一层的sample_mean(miu)是当前层输入的特征维度(1,30),二者维度不匹配,触发广播错误。
解决方法
每个BatchNorm层必须维护独立的bn_param参数,具体操作:
- 在模型初始化时,为每个BatchNorm层创建单独的
bn_param字典,比如:# 第一个BatchNorm层的参数 bn_param1 = {} # 第二个BatchNorm层的参数 bn_param2 = {} - 调用
batchnorm_forward时,分别传入对应层的bn_param,确保每个层的running_mean和running_var是基于自身输入特征维度初始化的。
原代码出错原因
当多个层共用同一个bn_param时:
- 第一个BatchNorm层运行后,
bn_param中会存入该层的running_mean(维度对应其输入特征数20); - 第二个BatchNorm层运行时,
bn_param.get("running_mean", np.zeros(D, dtype=x.dtype))会优先取出已存在的(1,20)维度的running_mean,而当前层计算的miu是(1,30)维度,二者无法进行元素级运算,因此抛出维度不匹配的错误。
内容的提问来源于stack exchange,提问作者Humbert
相关产品推荐
相关产品推荐

