37

我尝试使用以下代码(是浮点向量)实现soft-max :out_vecnumpy

numerator = np.exp(out_vec)
denominator = np.sum(np.exp(out_vec))
out_vec = numerator/denominator

但是,由于np.exp(out_vec). 因此,我(手动)检查了 的上限是多少,np.exp()发现那np.exp(709)是一个数字,但np.exp(710)被认为是np.inf. 因此,为了避免溢出错误,我修改了我的代码如下:

out_vec[out_vec > 709] = 709 #prevent np.exp overflow
numerator = np.exp(out_vec)
denominator = np.sum(np.exp(out_vec))
out_vec = numerator/denominator

现在,我得到一个不同的错误:

RuntimeWarning: invalid value encountered in greater out_vec[out_vec > 709] = 709

我添加的行有什么问题?我查找了这个特定的错误,我发现的只是人们关于如何忽略该错误的建议。简单地忽略错误对我没有帮助,因为每次我的代码遇到此错误时,它都不会给出通常的结果。

4

4 回答 4

36

您的问题是由数组中的NaNorInf元素引起的。out_vec您可以使用以下代码来避免此问题:

if np.isnan(np.sum(out_vec)):
    out_vec = out_vec[~numpy.isnan(out_vec)] # just remove nan elements from vector
out_vec[out_vec > 709] = 709
...

或者您可以使用以下代码将NaN值保留在数组中:

out_vec[ np.array([e > 709 if ~np.isnan(e) else False for e in out_vec], dtype=bool) ] = 709
于 2016-06-06T08:13:17.490 回答
14

在我的情况下,在比较之前调用它时警告没有出现(我比较了 NaN 值)

np.warnings.filterwarnings('ignore')
于 2018-02-17T10:24:47.747 回答
8

IMO 更好的方法是使用指数和的数值更稳定的实现。

from scipy.misc import logsumexp
out_vec = np.exp(out_vec - logsumexp(out_vec))
于 2016-12-28T11:00:36.807 回答
2

如果由于您的 NaN 值而发生这种情况,那么这可能会有所帮助:

out_vec[~np.isnan(out_vec)] = out_vec[~np.isnan(out_vec)] > 709

这对无 NaN 值执行更大的操作,其余部分保持不变。如果您需要其余部分为 False,那么也这样做:

out_vec[np.isnan(out_vec)] = False
于 2019-10-29T07:40:25.820 回答