我实现了一个神经网络,但它不起作用。有人能帮我找出问题所在吗?我尝试了简单的与、或、异或函数。成本函数似乎在减少,但在分类时失败了,我将迭代次数设置为50,000,更改了alpha值(0.1,0.01,0.001),编写了两种解决方案,一种是向量化方式,另一种是一次一个观察的方式。
这里是笔记本的查看器:http://nbviewer.ipython.org/gist/Abreu0101/05f6fe35b08eac1162c7
数据集:
def loadDataSet(): X = np.array([[1,1,1],[1,0,1],[1,1,0],[1,0,0]]) y = np.array([[1],[0],[0],[0]]) return X,y
代码:
X,y = loadDataSet()n_observations,n_features = X.shapeweights_1 = np.random.rand(2,3)weights_2 = np.random.rand(1,3)maxIter = 90000for currentIter in range(maxIter): costError(weights_1,weights_2,currentIter) #前馈 z_1 = X.dot(weights_1.T) a_1 = np.hstack((np.ones((n_observations,1)),sigmoid(z_1))) z_2 = a_1.dot(weights_2.T) a_2 = sigmoid(z_2) #反向传播 d_2 = (y - a_2) * sigmoid(z_2,derivate=True) d_1 = (d_2.dot(weights_2))[:,1:] alpha = 1 #学习率 weights_2 = weights_2 + alpha * d_2.T.dot(a_1) weights_1 = weights_1 + alpha * d_1.T.dot(X)
成本函数:
def costError(w_1,w_2,currentIter): z_1 = X.dot(w_1.T) a_1 = np.hstack((np.ones((n_observations,1)),sigmoid(z_1))) z_2 = a_1.dot(w_2.T) a_2 = sigmoid(z_2) sumError = np.sum(a_2) print("错误 : %f , 迭代次数: %d"%(sumError,currentIter))
提前感谢。
回答:
1) 将d_2和d_1更改为:
d_2 = (y - a_2)# * sigmoid(z_2,derivate=True)d_1 = (d_2.dot(weights_2))[:,1:]*sigmoid(z_1,derivate=True)
事实上,我不知道为什么* sigmoid(z_2,derivate=True)
需要被注释掉,但没有它神经网络收敛得更快,我看到的每个神经网络实现都没有在输出层乘以sigmoid函数的梯度。
2) sumError = np.sum(a_2)
是什么意思?你需要考虑预测值和实际值之间的差异:
sumError = np.mean((y-a_2)**2)
你的导数是为这个损失函数计算的。