学习或门通过梯度下降

2024-05-15 00:25:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图使我的程序学习或逻辑门使用神经网络和梯度下降算法。我把额外的输入神经元取为-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)

这段代码似乎产生的输出看起来不像一个或门。帮忙吗?在


Tags: targetinputdata阈值arrayactivationdoteta
1条回答
网友
1楼 · 发布于 2024-05-15 00:25:05

如果你把测试数据改成

activation = dot(array([[0,0,-1],[1,0,-1],[1,1,-1],[0,1,-1]]),wei)

(您的代码有0,0两次,而不是0,1)

^{pr2}$

在传唤之后

^{3}$

如你所愿。在

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

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

一。在

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

相关问题 更多 >

    热门问题