该程序导致非线性函数溢出。最后,输出在所有元素中都是nan。

import numpy as np

def nonlin(x,deriv=False):
    if(deriv==True):
        return x*(1-x)

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

X = np.array([[0,0],[0,1],[1,0],[1,1]])
Y = np.array([[0],[1],[1],[0]])

w1 = np.random.random((2,2))
w2 = np.random.random((2,1))

for i in range(1000):
    a0 = X
    z1 = np.dot(a0,w1)
    a1 = nonlin(z1)

    z2 = np.dot(a1,w2)
    a2 = nonlin(z2)
    C = Y-a2
    #if(i%10==0):
    #   print(np.mean(np.abs(C)))

    Cdz2 = C*nonlin(z2,True)
    Cdz1 = Cdz2.dot(w2.T)*nonlin(z1,True)

    w2 += a1.T.dot(Cdz2)
    w1 += a0.T.dot(Cdz1)

print(a2)


反向传播方法在非线性函数中给出运行时警告。

最佳答案

您对变量名的选择可能会产生误导:z通常是非线性的输出,而您将其用于线性组合,而a既用于输入也用于输出。

在反向传播步骤中,需要在应用了非线性之后计算隐藏层和输出层的输出的导数。

您的情况应该是

Cdz2 = C*nonlin(a2,True)
Cdz1 = Cdz2.dot(w2.T)*nonlin(a1,True)


其中z2变为a2并且z1变为a1

通过此更改,我了解到:

[[ 0.23807658]
 [ 0.70736702]
 [ 0.70728018]
 [ 0.37925629]]


1000步骤之后

[[ 0.01972628]
 [ 0.95332159]
 [ 0.95332158]
 [ 0.06245363]]


20000步骤之后。

我建议您使用更合理的变量名,如果您遵循的是一本教科书,只需使用相同的符号,这样就更容易看到公式如何转换为代码。

关于python - 为什么这个神经网络会发出运行时警告?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50871530/

10-12 21:37