感知器:每个样本数据的权重,或一个共同的权重

通过感知学习,我真的对初始化和更新权重感到困惑。如果我有一个包含2个输入x0和x1的样本数据,并且我在这2个输入中有80行,则矩阵为80x2。

我是否需要将权重初始化为80x2或仅2个值w0和w1的矩阵?感知器学习的最终目标是找到两个权重w0和w1,它们应该适合所有80个输入样本行吗?

我有以下代码,尽管进行了10,000次迭代,但我的错误从未达到0。

x=input matrix of 80x2
y=output matrix of 80x1
n = number of iterations
w=[0.1,0.1]  
learningRate = 0.1
for i in range(n): 
    expectedT = y.transpose();
    xT = x.transpose()
    prediction =  np.dot (w,xT) 

    for i in range (len(x)):    
        if prediction[i] >= 0:                               
                 ypred[i] = 1                               
        else:                                   
                ypred[i] = 0

    error = expectedT - ypred

    # updating the weights
    w = np.add(w,learningRate*(np.dot(error,x)))
    globalError = globalError + np.square(error)
sheng13love 回答:感知器:每个样本数据的权重,或一个共同的权重

对于每个功能,您将拥有一个权重。因此,您有两个功能和两个权重。这也有助于引入偏见,这会增加另一个权重。有关偏差的更多信息,请检查此Role of Bias in Neural Networks。权重的确应该学习如何最适合样本数据。根据数据,这可能意味着您永远不会达到0的误差。例如,当使用单调激活函数时,单层感知器无法学习XOR门。 (solving XOR with single layer perceptron)。

对于您的示例,我将建议两件事。当误差低于某个阈值或例如误差为0时,引入偏差并停止训练。

我完成了您的示例,以学习逻辑与门:

# AND input and output
x = np.array([[0,0],[0,1],[1,1]])
y = np.array([0,1,1])

n = 1000
w=[0.1,0.1,0.1]  
learningRate = 0.01
globalError = 0

def predict(X):
    prediction =  np.dot(w[0:2],X) + w[2] 
    ypred = np.zeros(len(y))
    for i in range (len(y)):    
        if prediction[i] >= 0:                               
                ypred[i] = 1                               
        else:                                   
                ypred[i] = 0
    return ypred

for i in range(n): 
    expectedT = y.transpose();
    xT = x.transpose()
    ypred = predict(xT)

    error = expectedT - ypred
    if sum(error) == 0:
        break

    # updating the weights
    w[0:2] = np.add(w[0:2],learningRate*(np.dot(error,x)))
    w[2] += learningRate*sum(error)
    globalError = globalError + np.square(error)

训练后错误为0

print(error)
# [0. 0. 0. 0.]

权重如下

print(w)
#[0.1,-0.00999999999999999]

感知器现在可以用作AND门:

predict(x.transpose())
#array([0.,1.,1.])

希望有帮助

本文链接:https://www.f2er.com/3109076.html

大家都在问