通过梯度下降学习OR门

时间:2016-06-24 12:59:38

标签: python numpy machine-learning

我正在尝试使用神经网络和梯度下降算法使我的程序学习OR逻辑门。我将额外的输入神经元作为-1,以便我可以调整神经元的阈值以便稍后激活。目前的门槛只是0。 这是我的实施尝试

#!/usr/bin/env python
from numpy import *
def pcntrain(inp, tar, wei, eta):
    for data in range(nData):
        activation = dot(inp,wei)
        wei += eta*(dot(transpose(inp), target-activation))
        print "ITERATION " + str(data)
        print wei
    print "TESTING LEARNED ALGO"
    # Sample input
    activation = dot(array([[0,0,-1],[1,0,-1],[1,1,-1],[0,0,-1]]),wei)
    print activation
nIn = 2
nOut = 1
nData = 4
inputs = array([[0,0],[0,1],[1,0],[1,1]])
target = array([[0],[1],[1],[1]])
inputs = concatenate((inputs,-ones((nData,1))),axis=1) #add bias input = -1
weights = random.rand(nIn +1,nOut)*0.1-0.05 #random weight 
if __name__ == '__main__':
    pcntrain(inputs, target, weights, 0.25)

此代码似乎产生的输出似乎不是OR门。帮助

1 个答案:

答案 0 :(得分:1)

如果您将测试数据更正为

,那么 是一个OR门
activation = dot(array([[0,0,-1],[1,0,-1],[1,1,-1],[0,1,-1]]),wei)

(你的代码有0,0两次,而且从不0,1)它产生

[[ 0.30021868]
 [ 0.67476151]
 [ 1.0276208 ]
 [ 0.65307797]]

,在调用round后给出

[[ 0.]
 [ 1.]
 [ 1.]
 [ 1.]]

根据需要。

但是,您确实有一些小错误:

  • 你正在运行4次梯度下降迭代(主循环),而且它来自于你使用多个输入来指定的事实 - 这就是incorret,“合理”迭代次数与数量之间没有关系分数。如果你运行100次迭代,你最终会得到更接近的分数

[[ 0.25000001]
 [ 0.75      ]
 [ 1.24999999]
 [ 0.75      ]]
  • 您的模型是线性的并且具有线性输出,因此您不能指望它精确地输出0和1,上述结果(0.25,0.75和1.25)实际上是这种模型模型的最佳解决方案。如果你想让它收敛到漂亮的0/1,你需要输出中的sigmoid,因此不同的损失/衍生物(这仍然是ML意义上的线性模型,你只需在输出上有一个压扁函数,使其工作正确空间)。
  • 你没有在你的函数中使用“tar”参数,相反,你引用全局变量“target”(它具有相同的值,但这是一个明显的错误)