运行时警告:在较大的

时间:2016-06-06 07:30:16

标签: python numpy softmax

我尝试使用以下代码实现soft-maxout_vec是浮动的numpy向量):

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 个答案:

答案 0 :(得分:24)

您的问题是由NaN数组中的Infout_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

答案 1 :(得分:9)

在我的情况下,在比较之前调用此警告时没有显示警告(我已经比较了NaN值)

char* StringEncryptor(char *input, char *key) {
    size_t len = strlen(input);
    char *encrypted = malloc(len + 4);
    unsigned int i;  

    for(i = len; i != 0; i--) { //XOR with a key;

        *(encrypted + i + 4)= *(input + i) ^ (key[i % 8]);

    }

    *(size_t *)(encrypted) = len;

    return encrypted;
}

答案 2 :(得分:6)

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

from scipy.misc import logsumexp
out_vec = np.exp(out_vec - logsumexp(out_vec))

答案 3 :(得分:0)

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

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

这将对没有NaN值的操作进行更大的操作,其余的保持不变。如果您需要其余部分为False,则也可以这样做:

out_vec[np.isnan(out_vec)] = False