2隐层神经网络的反向传播

2024-06-28 18:53:20 发布

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

我试着建立我的第一个神经网络,我试着建立一个有两个隐藏层的神经网络,但这不是学习。你知道吗

我很确定前馈部分工作得很好,但是不管我如何训练它(使用异或表),误差并没有减少,它只是在0.5左右振荡。我猜反向传播部分有问题,但我已经修改了很多次,甚至计算出它应该是没有用的。你知道吗

代码如下:

class NeuralNetwork:

    def __init__(self, input_size, output_size):

        # Sets the input and output sizes
        self.inputs  = input_size
        self.outputs = output_size

        # Sets size of hidden layers
        self.L1 = 2
        self.L2 = 2

        # Initializes weights
        self.W1 = np.random.rand(self.inputs.shape[1], self.L1)
        self.W2 = np.random.rand(self.L1, self.L2)
        self.W3 = np.random.rand(self.L2, self.outputs.shape[1])


    # The network evaluates the inputs
    def feedforward(self, inp):

        self.inputs = inp

        # Evaluates layer 1
        Z1 = sig(np.dot(self.inputs, self.W1))

        # Evaluates layer 2
        Z2 = sig(np.dot(Z1, self.W2))

        # Evaluates end result
        Z3 = sig(np.dot(Z2, self.W3))

        self.outputs = Z3

    # Backpropagation
    def train(self, inp, outp):

        # Evaluate the input
        self.inputs = inp

        # Evaluates layer 1
        Z1 = sig(np.dot(self.inputs, self.W1))

        # Evaluates layer 2
        Z2 = sig(np.dot(Z1, self.W2))

        # Evaluates end result
        Z3 = sig(np.dot(Z2, self.W3))

        # Evaluate the error
        error = Z3 - outp

        print("Error: " +  str(abs(error.sum())))

        # Backpropagates
        dcost_dpred = error
        dpred_dz = dsig(np.dot(Z2, self.W3))

        z_delta = dcost_dpred * dpred_dz
        self.W3 -= lr * np.dot(Z2.T, z_delta)

        z_delta = np.dot(z_delta, self.W3.T)
        self.W2 -= lr * (np.dot(Z1.T, z_delta) * dsig(np.dot(Z1, self.W2)))

        z_delta = np.dot(z_delta, self.W2.T)
        self.W1 -= lr * (np.dot(self.inputs.T, z_delta) * dsig(np.dot(self.inputs, self.W1)))

真的错了吗?如果是,我该怎么修?你知道吗


Tags: theselfinputsizenpdotw1delta