You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用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

额外优化:避免数值溢出

顺便提一句,直接对znp.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

火山引擎 最新活动