在训练我的神经网络后,我得到了每个输入数据相同的输出(2000个输入,1个输出)

2024-04-26 10:37:21 发布

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

我正在尝试实现一个有大约2000个输入的神经网络。你知道吗

为了检查iris数据集,我做了一些测试,它似乎可以工作,但是当我运行测试时,它抛出错误的结果,大多数时候,对于所有的测试,我对每个数据都获得相同的输出。我担心,如果它是某种程度上有关的偏见过程和梯度更新,也许你们可以发现错误或给我一些建议。 下面是反向传播过程的部分代码。你知道吗

def backward_propagation(parameters, cache, X, Y):

    #weights
    W1 = parameters['W1']
    W2 = parameters['W2']
    #Outputs after activation function
    A1 = cache['A1']
    A2 = cache['A2']
    dZ2= A2 - Y
    dW2 = np.dot(dZ2, A1.T)
    db2 = np.sum(dZ2, axis=1, keepdims=True)
    dZ1 = np.multiply(np.dot(W2.T, dZ2), 1 - np.power(A1, 2))
    dW1 = np.dot(dZ1, X.T)
    db1 = np.sum(dZ1, axis=1, keepdims=True)
    gradient = {"dW1": dW1,
             "db1": db1,
             "dW2": dW2,
             "db2": db2}    
    return gradient

Tags: 数据a2cache过程a1npdotparameters
1条回答
网友
1楼 · 发布于 2024-04-26 10:37:21

如果您不提供预测和转发功能,则很难看到它是否真的正常工作。你知道吗

这样我们就可以确切地知道正在做什么,并查看反向传播是否真的正确。你知道吗

你没有正确地导出sigmoid函数,我认为你也没有正确地应用链式规则。你知道吗

从我看到的情况来看,您正在使用此体系结构:

enter image description here

梯度为(应用链式法则):

enter image description here

在您的代码中,它按以下方式转换:

W1 = parameters['W1']
W2 = parameters['W2']
#Outputs after activation function
A1 = cache['A1']
A2 = cache['A2']
dA2= A2 - Y

dfc2 = dA2*A2*(1 - A2)
dA1 = np.dot(dfc2, W2.T)
dW2 = np.dot(A1.T, dfc2)
db2 = np.sum(dA2, axis=1, keepdims=True)


dfc1 = dA1*A1*(1 - A1)
dA1 = np.dot(dfc1, W1.T)
dW1 = np.dot(X.T, dfc1)
db1 = np.sum(dA1, axis=1, keepdims=True)
gradient = {
    "dW1": np.sum(dW1, axis=0),
    "db1": np.sum(db1, axis=0),
    "dW2": np.sum(dW2, axis=0),
    "db2": np.sum(db2, axis=0)
}

我检查是否执行以下代码:

import numpy as np

W1 = np.random.rand(30, 10)
b1 = np.random.rand(10)
W2 = np.random.rand(10, 1)
b2 = np.random.rand(1)
def sigmoid(x):
    return 1 / (1 + np.exp(-x))

X = np.random.rand(100, 30)
Y = np.ones(shape=(100, 1)) #...

for i in range(100000000):
    fc1 = X.dot(W1) + b1
    A1 = sigmoid(fc1)

    fc2 = A1.dot(W2) + b2
    A2 = sigmoid(fc2)
    L = np.sum(A2 - Y)**2
    print(L)

    dA2= A2 - Y
    dfc2 = dA2*A2*(1 - A2)
    dA1 = np.dot(dfc2, W2.T)
    dW2 = np.dot(A1.T, dfc2)
    db2 = np.sum(dA2, axis=1, keepdims=True)


    dfc1 = dA1*A1*(1 - A1)
    dA1 = np.dot(dfc1, W1.T)
    dW1 = np.dot(X.T, dfc1)
    db1 = np.sum(dA1, axis=1, keepdims=True)
    gradient = {
        "dW1": dW1,
        "db1": db1,
        "dW2": dW2,
        "db2": db2
    }

    W1 -= 0.1*np.sum(dW1, axis=0)
    W2 -= 0.1*np.sum(dW2, axis=0)
    b1 -= 0.1*np.sum(db1, axis=0)
    b2 -= 0.1*np.sum(db2, axis=0)

如果上次激活是一个sigmoid,则该值将介于0和1之间。你应该记住,通常这是用来表示一个概率和交叉熵通常是作为损失使用。你知道吗

相关问题 更多 >