【问题标题】:Overflow Error in Neural Networks implementation神经网络实现中的溢出错误
【发布时间】:2014-06-01 10:40:53
【问题描述】:

我正在尝试构建自己的神经网络反向传播算法实现。到目前为止,我为训练编写的代码是这样的,

def train(x,labels,n):
    lam = 0.5
    w1 = np.random.uniform(0,0.01,(20,120))     #weights
    w2 = np.random.uniform(0,0.01,20)
    for i in xrange(n):
            w1 = w1/np.linalg.norm(w1)
            w2 = w2/np.linalg.norm(w2)
            for j in xrange(x.shape[0]):
                    y1 = np.zeros((600))        #output
                    d1 = np.zeros((20))
                    p = np.mat(x[j,:])
                    a = np.dot(w1,p.T)          #activation
                    z = 1/(1 + np.exp((-1)*a))
                    y1[j] = np.dot(w2,z)
                    for k in xrange(20):
                            d1[k] = z[k]*(1 - z[k])*(y1[j] - labels[j])*np.sum(w2) #delta update rule
                            w1[k,:] = w1[k,:] - lam*d1[k]*x[j,:]     #weight update
                            w2[k] = w2[k] - lam*(y1[j]-labels[j])*z[k]
                    E = 1/2*pow((y1[j]-labels[j]),2)                 #mean squared error
            print E
    return 0

输入单元数 - 120, 隐藏单元的数量 - 20, 输出单元数 - 1, 训练样本数 - 600

x 是一个 600*120 的训练集,均值和单位方差为零,最大值为 3.28,最小值为 -4.07。前 200 个样本属于第 1 类,后 200 个属于第 2 类,最后 200 个属于第 3 类。标签是分配给每个样本的类标签,n 是收敛所需的迭代次数。每个样本有 120 个特征。

我已经初始化了 0 到 0.01 之间的权重,输入数据被缩放为具有单位方差和零均值,但代码仍然会引发溢出警告,导致“a”,即激活值为 NaN。我无法理解似乎是什么问题。

每个样本都有 120 个元素。 x 的样本行:

[ 0.80145231  1.29567936  0.91474224  1.37541992  1.16183938  1.43947296
  1.32440357  1.43449479  1.32742415  1.40533852  1.28817561  1.37977183
  1.2290933   1.34720161  1.15877069  1.29699635  1.05428735  1.21923531
  0.92312685  1.1061345   0.66647463  1.00044203  0.34270708  1.05589558
  0.28770958  1.21639524  0.31522575  1.32862243  0.42135899  1.3997094
  0.5780146   1.44444501  0.75872771  1.47334256  0.95372771  1.48878048
  1.13968139  1.49119962  1.33121905  1.47326017  1.47548571  1.4450047
  1.58272343  1.39327328  1.62929132  1.31126604  1.62705274  1.21790335
  1.59951034  1.12756958  1.56253815  1.04096709  1.52651382  0.95942134
  1.48875633  0.87746762  1.45248623  0.78782313  1.40446404  0.68370011

【问题讨论】:

  • 你能给出示例输入吗(x,labels,n)?
  • 您似乎在使用 np.dot 将一个 numpy 数组和一个 numpy 矩阵相乘 - 可能不是好的做法(请参阅 this)。 p 可以改为数组吗?我不知道这是否是您的问题的原因。
  • 我这样做是为了调试。我之前用 p 作为数组来实现它。还是不行。
  • 你能说出xlabelsn 是什么吗?
  • 谢谢,x 数组的大小/形状是多少?问题中的示例输入会很好:-)

标签: python numpy neural-network


【解决方案1】:

溢出

随着信号强度的增加,逻辑 sigmoid 函数在 NumPy 中容易溢出。尝试附加以下代码行:

np.clip( signal, -500, 500 )

这会将 NumPy 矩阵中的值限制在给定的区间内。这将反过来防止 sigmoid 函数中的精度溢出。

>>> arr
array([[-900, -600, -300],
       [   0,  300,  600]])
>>> np.clip( arr, -500, 500)
array([[-500, -500, -300],
       [   0,  300,  500]])

实施

这是我在项目中使用的 sn-p:

def sigmoid_function( signal ):
    # Prevent overflow.
    signal = np.clip( signal, -500, 500 )

    # Calculate activation signal
    signal = 1.0/( 1 + np.exp( -signal ))

    return signal
#end

Sigmoid函数为什么会溢出?

随着训练的进行,网络会提高其精度。随着这种精度接近完美,sigmoid 信号要么从下方接近 1,要么从上方接近 0。例如:0.99999999999... 或 0.00000000000000001...

由于 NumPy 专注于执行高度精确的数值运算,它会尝试保持尽可能高的精度,从而导致溢出错误。注意:可以通过设置忽略此错误消息:

np.seterr( over='ignore' )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-23
    • 2019-06-22
    • 2015-09-22
    • 2017-11-20
    • 2021-02-16
    • 1970-01-01
    • 1970-01-01
    • 2018-10-28
    相关资源
    最近更新 更多