我正在尝试使用神经网络和梯度下降算法让我的程序学习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)


此代码似乎产生的输出似乎不像“或”门。救命?

最佳答案

好吧,这是一个“或”门,如果您将测试数据更正为

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]]


在调用回合后

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


如预期的。

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


您正在运行4次梯度下降(主循环)迭代,这还来自以下事实:您使用输入数来指定-这是不正确的,“合理”迭代数与点数之间没有关系。如果运行100次迭代,最终得分会更高




[[ 0.25000001]
 [ 0.75      ]
 [ 1.24999999]
 [ 0.75      ]]



您的模型是线性的并且具有线性输出,因此您不能期望它精确地输出0和1,上述结果(0.25、0.75和1.25)实际上是这种模型模型的最佳解决方案。如果您希望它收敛到很好的0/1,则需要在输出中使用Sigmoid,因此需要不同的损耗/导数(从ML角度来看,这仍然是线性模型,您只需在输出中具有压扁功能即可使其正常工作)空间)。
您没有在函数中使用“ tar”参数,而是引用了全局变量“ target”(具有相同的值,但这是一个明显的错误)

关于python - 通过梯度下降学习或门,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38014053/

10-12 18:01