我正在尝试在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
我认为在向网络中添加较大的值时会发生溢出错误。
答案 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的倒数以获得近似解,因为四舍五入的差异。