这个程序导致非线性函数溢出。最后,输出得到所有元素的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
用于输入和输出。你知道吗在反向传播步骤中,在应用非线性之后,需要计算隐藏层和输出层输出的导数。你知道吗
你的情况应该是
其中
z2
变成a2
,z1
变成a1
通过这一变化,我了解到:
在
1000
步骤和之后在
20000
步之后。你知道吗我建议你使用更合理的变量名,如果你遵循的是教科书,只要使用相同的符号,这样就更容易看到公式如何翻译成代码。你知道吗
相关问题 更多 >
编程相关推荐