神经网络无法学习

时间:2019-10-17 06:31:21

标签: python-3.x neural-network linear-regression non-linear-regression

我在Python中关注trask's article to build a bare bone neural network。尽管他构建了1层网络(将3个输入映射到单个输出)和2层网络(具有3个输入,4个神经元隐藏层和具有单个神经元的输出层)。

我的任务是建立一个可以近似函数 Y = X1 + X2 + X3 < / em> 。我为网络提供了Y,它会猜测x1,x2和x3的值。

为此,我修改了上面的网络。我试图反转上述两个网络,即尝试将单个输入映射到3个输出。我已经使用Tensorflow API做到了这一点,但希望在没有此类高级API的情况下实现它。我的网络看起来像这样:

enter image description here

这是我实施的方式:

import numpy as np

# sigmoid function 
def nonlin(x,deriv=False):
    if(deriv==True):    #Find gradient
        return x*(1-x)
    return 1/(1+np.exp(-x))

#Training Data
##OUTPUT 
y=np.random.randint(1,255,size=(50,3)).astype(int)   #dims:(m,3), m is training examples
##INPUT
X = np.sum(y, axis = 1, keepdims=True)  #dims:(m,1)

#Weights for synapses 
##between Input layer and hidden layer
syn0 = 2*np.random.random((1,4)) - 1
##between hidden layer Output layer 
syn1 = 2*np.random.random((4,3)) - 1

#Training
for iter in range(100):

    # forward propagation
    l0 = X
    l1 = nonlin(np.dot(l0,syn0))
    l2 = nonlin(np.dot(l1,syn1))

    # how much did we miss?
    l2_error = y-l2
    #Visualizing the error change
    if (iter% 100) == 0:
        print ("Error:" + str(np.mean(np.abs(l2_error))))

    l2_delta = l2_error*nonlin(l2, deriv=True)

    l1_error = l2_delta.dot(syn1.T)

    # 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
    syn1 += l1.T.dot(l2_delta)
    syn0 += l0.T.dot(l1_delta)

但是我注意到权重没有得到应有的更新。他们很快停止。我不确定是什么问题。我试图在测试值= 100上测试网络。

test_case = np.array([[300]])
l1_out = nonlin(np.dot(test_case,syn0))
l2_out = nonlin(np.dot(l1_out,syn1))
print(l2_out)

但是我得到了 x1 x2 x3 的怪异值。虽然我应该分别得到100、100和100。

如此简单的实现可能是什么问题?

(PS:我认为这是规范化的问题。如果是,我应该如何实现?)

0 个答案:

没有答案