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

如何动态调整数组形状以解决Softmax计算中的ValueError问题?

解决Softmax计算中的广播维度不匹配问题

核心问题

你遇到的ValueError本质是维度广播不匹配:

  • e_x的形状是(1,176,768),包含3个维度
  • e_x.sum(axis=-1)会消除最后一个求和维度,得到形状(1,176),只有2个维度
    numpy无法将2维数组和3维数组直接广播,因此报错。

正确解决方案:保留求和维度

修改sum操作时添加keepdims=True参数,让求和结果保留被计算的维度(最后一维),这样就能自动适配广播规则:

import numpy as np

def softmax_og(x):
    e_x = np.exp(x - np.max(x))
    # 添加keepdims=True,保留最后一维的维度信息
    return e_x / e_x.sum(axis=-1, keepdims=True)
  • 此时e_x.sum(axis=-1, keepdims=True)的形状是(1,176,1)
  • numpy会自动将(1,176,1)广播到(1,176,768),与e_x的形状完全匹配,除法操作正常执行。

分析你之前的错误尝试

  1. 强行reshape为(1,176,768):
    sum后的数组只有176个元素,而目标形状需要1*176*768=135936个元素,元素数量不匹配,必然报错。
  2. reshape为(1,176,-1):
    如果sum后的数组确实是(1,176)(176个元素),reshape后应该得到(1,176,1),这是可行的,但你报错提到size204,可能是测试时输入x的形状发生了变化。不过这种手动reshape的方式不如keepdims通用。
  3. 按公约数重塑形状:
    广播规则只要求维度从后往前匹配,不需要元素数量成比例,这种思路完全偏离了问题本质,属于无效尝试。

对你问题的直接回答

  • 动态调整形状的方法:除了keepdims=True,还可以用np.expand_dims手动扩展维度,比如e_x.sum(axis=-1)[..., np.newaxis],效果和keepdims一致,都是动态保持维度对齐。
  • 你忽略的点:sum操作默认会消除被求和的维度,而广播需要维度数量和对应位置的尺寸匹配(要么相等,要么其中一个为1),保留维度是解决问题的关键。
  • 是否是其他问题的副作用:不是,这就是典型的numpy广播维度不匹配问题,核心原因是sum后维度丢失,和其他问题无关。

内容的提问来源于stack exchange,提问作者Jesper Ezra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 19:22:28