简单神经网络不学习非线性数据?

时间:2018-01-14 11:31:16

标签: python machine-learning neural-network

我试图理解为什么这个带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)

2 个答案:

答案 0 :(得分:0)

因为您的模型本质上是一个线性模型。如果要拟合非线性数据,则需要添加至少一个隐藏层。

答案 1 :(得分:0)

如前所述,您构建了一个简单的线性逻辑回归模型。

NN中的S形仅用于预测模型,而不是实际非线性训练NN。

学习神经网络的良好开端是:http://www.wildml.com/2015/09/implementing-a-neural-network-from-scratch/