【问题标题】:Neural Network not learning - python [closed]神经网络不学习 - python [关闭]
【发布时间】:2015-08-04 18:08:33
【问题描述】:

我实现了一个 NN,但它不起作用。有人可以帮我弄清楚,是什么问题?我尝试使用简单的、and、or、xor 函数。代价函数好像变小了,但是在分类的那一刻失败了,我把迭代次数设置为50000,改变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.shape
weights_1 = np.random.rand(2,3)
weights_2 = np.random.rand(1,3)

maxIter = 90000
for currentIter in range(maxIter):
    costError(weights_1,weights_2,currentIter)

    #FeedFodward
    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)

    #BackPropagation
    d_2 = (y - a_2) * sigmoid(z_2,derivate=True)
    d_1 = (d_2.dot(weights_2))[:,1:]

    alpha = 1 #Learning Rate
    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("Error : %f , Iter: %d"%(sumError,currentIter))

提前致谢。

【问题讨论】:

  • 请将您的代码(或MVCE)直接发布到 SO。
  • 感谢 Richard 的推荐,我做到了。虽然我放了一个笔记本的链接,但它是无效的吗?
  • 查看meta-post 了解直接向 SO 发帖的一些原因。

标签: python machine-learning neural-network ipython-notebook


【解决方案1】:

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)需要被注释掉,但是没有它nn收敛得更快,而且我看到的每一个nn的实现都是在没有乘以输出级别的sigmoid函数的梯度的情况下实现的。

2) sumError = np.sum(a_2) 是什么意思?您需要考虑预测值和实际值之间的差异:

sumError = np.mean((y-a_2)**2)

您为此损失函数计算的导数。

【讨论】:

  • 谢谢! @Olologin。现在它正在工作。我缺少 z_1 的导数。我使用 sigmoid 的导数,因为在这篇论文中 (www4.rgu.ac.uk/files/chapter3%20-%20bp.pdf) 说:“输出(1-输出)”项在方程中是必要的,因为 Sigmoid 函数——如果我们只使用阈值神经元,它会只是(目标 - 输出)。但是,正如您所指出的,在没有导数的情况下收敛速度更快。
猜你喜欢
  • 2016-07-11
  • 1970-01-01
  • 2019-03-15
  • 2011-08-17
  • 2020-10-29
  • 1970-01-01
  • 2016-11-28
  • 2013-04-22
  • 2018-10-05
相关资源
最近更新 更多