Leí mucho sobre el desbordamiento de la pila, pero todavía no puedo entender cómo evitar el error de desbordamiento. Estoy construyendo una red neuronal que utiliza la función sigmoide. Pero no puedo continuar sin convertir o encontrar una solución para estos errores.

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()

Aumento

ann.py:5: RuntimeWarning: overflow encountered in exp
  return  1/(1+np.exp(-x))
1
Boat 1 nov. 2017 a las 00:06

3 respuestas

La mejor respuesta

SciPy viene con una función para hacer eso, que no te dará esa advertencia:

scipy.special.expit(x)
4
user2357112 supports Monica 31 oct. 2017 a las 21:24

Parece que los datos pasados deben ser un número entero, aunque esta función de activación debería devolver un flotante. Supongo que la solución es tan simple como

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

Supongo que sin este cambio, el código intenta hacer una división entera y, por lo tanto, genera el error.

0
bremen_matt 31 oct. 2017 a las 21:24

Debe tener cuidado cuando utilice enteros numpy porque no tienen una precisión arbitraria como se indica aquí ¿Se pueden desbordar las operaciones de enteros en Python?

Para numpy double, ese rango es (-1.79769313486e+308, 1.79769313486e+308).

También eche un vistazo a esta respuesta que lo describe bastante bien.

Aquí hay más información sobre los tipos de numpy y su rango permitido.

0
Alan Garrido 31 oct. 2017 a las 21:31