当我使用这个随机生成器:^{
ValueError: sum(pvals[:-1]) > 1.0
我总是传递这个softmax函数的输出:
^{pr2}$除了现在我得到了这个错误,我还为参数(pvals
)添加了以下内容:
while numpy.sum(pvals) > 1:
pvals /= (1+1e-5)
但这并没有解决问题。什么是确保我避免这个错误的正确方法?在
编辑:下面是包含此代码的函数
def get_MDN_prediction(vec):
coeffs = vec[::3]
means = vec[1::3]
stds = np.log(1+np.exp(vec[2::3]))
stds = np.maximum(stds, min_std)
coe = softmax(coeffs)
while np.sum(coe) > 1-1e-9:
coe /= (1+1e-5)
coeff = unhot(np.random.multinomial(1, coe))
return np.random.normal(means[coeff], stds[coeff])
我使用的
softmax
实现对于我使用它的值来说不够稳定。因此,有时输出的和大于1
(例如1.0000024...
)。在这种情况应该由while循环处理。但有时输出包含nan,在这种情况下,循环永远不会触发,错误仍然存在。在
另外,
numpy.random.multinomial
如果看到NaN,则不会引发错误。在我现在使用的是:
很少有人注意到:通过从值中删除logsumexp,可以轻松获得softmax的健壮版本:
检查一下:
^{pr2}$很简单,不是吗?在
我在语言建模工作中也遇到了这个问题。在
这个问题的根源来自numpy的隐式数据转换:my sorfmax()的输出是在
float32
类型中,但是,numpy.random.multinomial()
会将pval
隐式转换为float64
类型。由于数值舍入,此数据类型转换有时会导致pval.sum()
超过1.0。在已识别并发布此问题here
相关问题 更多 >
编程相关推荐