神经网络未能学习 – python

我实现了一个神经网络,但它不起作用。有人能帮我找出问题所在吗?我尝试了简单的与、或、异或函数。成本函数似乎在减少,但在分类时失败了,我将迭代次数设置为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)

你的导数是为这个损失函数计算的。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注