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