我尝试使用以下代码实现soft-max(out_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
我添加的这条线有什么问题?我查了一下这个特定的错误,我找到的只是人们对如何忽略错误的建议。简单地忽略错误对我没有帮助,因为每次我的代码遇到这个错误都不会给出通常的结果。
答案 0 :(得分:24)
您的问题是由NaN
数组中的Inf
或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
答案 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