【问题标题】:Learning OR gate through gradient descent通过梯度下降学习或门
【发布时间】:2016-10-27 02:41:18
【问题描述】:

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

【问题讨论】:

    标签: python numpy machine-learning


    【解决方案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]]
    

    在调用回合后给出的

    [[ 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”(具有相同的值,但这是一个明显的错误)

    【讨论】:

    • 很好的答案,你能告诉我你是如何得到矩阵 [[ 0.] [ 1.] [ 1.] [ 1.]] 的吗?
    • 我将 numpy 导入为 np 并在你的分数上调用 np.round()
    猜你喜欢
    • 1970-01-01
    • 2019-02-22
    • 1970-01-01
    • 1970-01-01
    • 2023-01-25
    • 2023-03-06
    • 2013-11-22
    • 2018-03-26
    • 2023-02-25
    相关资源
    最近更新 更多