我试图理解为什么这个带Numpy的神经网络样本不会学习非线性数据。即使是简单的NN也应该学习非线性数据吗?
我希望我的NN知道如果输入为1则为0,如果输入大于1且小于4则为1.如果值> 4然后0。 我已经尝试了很多来自谷歌的numpy样本NN代码,我似乎遇到了这个问题。
以下代码不会学习,但可以通过输入[2,2,0,0]预期[1,1,0,0]来学习。
import numpy as np
# #sigmoid function
def nonlin(x,deriv=False):
if(deriv==True):
return x*(1-x)
return 1/(1+np.exp(-x))
# input dataset
X = np.array([ [1],
[2],
[3],
[4] ])
# #output dataset
y = np.array([[0,1,1,0]]).T
# #seed random numbers to make calculation
# #deterministic (just a good practice)
np.random.seed(1)
# #initialize weights randomly with mean 0
syn0 = 2*np.random.random((1,1)) - 1
for iter in range(10000):
# #forward propagation
l0 = X
l1 = nonlin(np.dot(l0,syn0))
# #how much did we miss?
l1_error = y - l1
# multiply how much we missed by the
# slope of the sigmoid at the values in l1
l1_delta = l1_error * nonlin(l1,True)
# #update weights
syn0 += np.dot(l0.T,l1_delta)
print ("Output After Training:")
print (l1)
答案 0 :(得分:0)
因为您的模型本质上是一个线性模型。如果要拟合非线性数据,则需要添加至少一个隐藏层。
答案 1 :(得分:0)
如前所述,您构建了一个简单的线性逻辑回归模型。
NN中的S形仅用于预测模型,而不是实际非线性训练NN。
学习神经网络的良好开端是:http://www.wildml.com/2015/09/implementing-a-neural-network-from-scratch/