如何避免溢出数字.exp()

2024-10-01 07:33:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我读了很多关于堆栈溢出的文章,但是我仍然不明白如何避免溢出错误。我正在建立一个使用sigmoid function的神经网络。 但我不能不转换或找到解决这些错误的方法。在

def activation(x):
    return  1/(1+np.exp(-x))

  def dactivation(x):
    return  activation(x)*(1-activation(x))


  def propagateb(self, target, lrate=8.1, momentum=0.1):
        deltas = []
        error = target - self.layers[-1]
        delta = error*dactivation(self.layers[-1])
        deltas.append(delta)
        for i in range(len(self.shape)-2,0,-1):
            delta =np.dot(deltas[0],self.weights[i].T)*dactivation(self.layers[i])
            deltas.insert(0,delta)
        for i in range(len(self.weights)):
            layer = np.atleast_2d(self.layers[i])
            delta = np.atleast_2d(deltas[i])
            dw = np.dot(layer.T,delta)
            self.weights[i] += lrate*dw + momentum*self.dw[i]
            self.dw[i] = dw

        # Return error
        return (error**2).sum()

提高

^{pr2}$

Tags: selftargetreturndeltaslayersdef错误np
3条回答

SciPy comes with a function to do that,它不会给你这个警告:

scipy.special.expit(x)

似乎传入的数据必须是整数,尽管这个激活函数应该返回一个浮点值。我想解决方法很简单

return  1./(1.+np.exp(-x))

我想如果没有这种改变,代码就会尝试进行整数除法,从而产生错误。在

使用numpy整数时必须小心,因为它们没有这里所述的任意精度Can Integer Operations Overflow in Python?

对于numpy double,这个范围是(-1.79769313486e+308, 1.79769313486e+308)。在

也可以看看这个answer,它很好地描述了它。在

Here是有关numpy数据类型及其允许范围的详细信息。在

相关问题 更多 >