计算中断代码中的Numpy溢出

时间:2018-11-07 14:18:18

标签: python python-3.x numpy runtime-error

我正在尝试在Python 3.7中训练神经网络。为此,我使用Numpy进行计算并进行矩阵乘法。我发现此错误

RuntimeWarning: overflow encountered in multiply(当我乘矩阵时)

这反过来导致产生nan值,这会引起类似

的错误

RuntimeWarning: invalid value encountered in multiply

RuntimeWarning: invalid value encountered in sign

现在,我已经看到许多与此问题相关的答案,所有这些都解释了为什么会这样。但是我想知道,“我该如何解决这个问题?”。我尝试使用默认的math模块,但是仍然无法正常工作,并引发类似

的错误

TypeError: only size-1 arrays can be converted to Python scalars

我知道我可以使用for循环来进行乘法运算,但是这在计算上非常昂贵,并且会使代码加长并使代码复杂化。有什么解决办法吗?就像使用Numpy进行某些操作(我知道有一些方法可以处理异常,但不能解决异常),如果没有,那么也许可以替代Numpy,这不需要我太多更改代码?

我真的不介意我的数据的精度是否有所妥协。 (如果有助于矩阵的dtype为float64

编辑: 这是我的代码的虚拟版本:

import numpy as np
network = np.array([np.ones(10), np.ones(5)])
for i in range(100000):
    for lindex, layer in enumerate(network):
        network[lindex] *= abs(np.random.random(len(layer)))*200000

我认为在向网络中添加较大的值时会发生溢出错误。

1 个答案:

答案 0 :(得分:1)

这是我在使用ReLu激活剂时也遇到的神经网络问题,因为正极范围无限大。有两种方法可以解决此问题:

A)使用另一种激活功能:atan,tanh,Sigmoid或范围有限的任何其他功能

但是,如果找不到合适的选项:

B)减弱ReLu激活。这可以通过缩小ReLu和ReLu prime函数的所有值来实现。这是代码上的区别:

##Normal Code
def ReLu(x,derivative=False):
    if derivative:
        return 0 if x<0 else 1
    return 0 if x<0 else x

##Adjusted Code
def ReLu(x,derivative=False):
    scaling_factor = 0.001
    if derivative:
        return 0 if x<0 else scaling_factor
    return 0 if x<0 else scaling_factor*x

由于您愿意在精度上做出妥协,因此这是您的理想解决方案!最后,您可以乘以scaling_factor的倒数以获得近似解,因为四舍五入的差异。