我在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的情况下实现它。我的网络看起来像这样:
这是我实施的方式:
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:我认为这是规范化的问题。如果是,我应该如何实现?)