如何用NumPy实现Softmax函数?解决维度不匹配报错问题
解决Softmax函数的NumPy广播错误
嘿,我懂你碰到的这个问题——NumPy的广播规则在这里确实容易踩坑!你当前的代码里,np.sum(t, axis=1)返回的是一个一维数组(形状(20,)),而你的t是二维数组(20,10),直接做除法时,NumPy没办法自动把一维数组和二维数组的每行对应起来,所以才抛出了ValueError。
要实现“每行元素除以该行的和”,核心是让求和后的结果保持和原数组匹配的维度,这样广播机制才能正常工作。这里有两种简单的解决方法:
方法1:使用keepdims=True参数
这是最直观的方式,keepdims=True会让np.sum保留被求和的维度(这里是axis=1),返回的结果形状会是(20,1),刚好能和t的(20,10)逐行对应做除法:
import numpy as np def soft_max(z): t = np.exp(z) # 加上keepdims=True,保持求和后的维度为(20,1) a = t / np.sum(t, axis=1, keepdims=True) return a
方法2:手动reshape求和结果
如果你不想用keepdims,也可以手动把一维的求和结果转换成列向量(形状(20,1)),用reshape(-1, 1)就能自动匹配行数:
import numpy as np def soft_max(z): t = np.exp(z) row_sums = np.sum(t, axis=1).reshape(-1, 1) a = t / row_sums return a
额外优化:避免数值溢出
顺便提一句,直接对z做np.exp可能会因为z值过大导致数值溢出(比如z里有很大的正数时,exp结果会变成无穷大)。行业内的常规做法是先对每行减去该行的最大值,这样能保证exp的输入不会太大,同时不改变softmax的输出结果:
import numpy as np def soft_max(z): # 先减去每行最大值,避免数值溢出 z_stable = z - np.max(z, axis=1, keepdims=True) t = np.exp(z_stable) a = t / np.sum(t, axis=1, keepdims=True) return a
这样修改后,你的softmax函数就能正确运行,同时还更稳定啦!
内容的提问来源于stack exchange,提问作者Wizard




