首页 > 解决方案 > 如何更新权重和偏差

问题描述

我正在尝试从头开始编写一个带有 numpy 的神经网络来识别 hand_written_digits。但是我在更新权重和偏差方面有点困惑

这是我的代码

class NeuralNetwork():

    learning_rate = 0.0001
    ephochs = 10000
    nodes_in_input_layer = 784  # features
    nodes_in_hidden_layer = 100
    nodes_in_output_layer = 10  # classes
    np.random.seed(3)


    def __init__(self):
        self.hidden_layer = {'weights': np.random.rand(self.nodes_in_input_layer, self.nodes_in_hidden_layer)*0.1,
                             'biases': np.random.rand(self.nodes_in_hidden_layer)*0.1 }

        self.output_layer = {'weights': np.random.rand(self.nodes_in_hidden_layer, self.nodes_in_output_layer)*0.1,
                             'biases': np.random.rand(self.nodes_in_output_layer)*0.1 }

        print('self.hidden_layer: ',self.hidden_layer['weights'].shape)
        print('self.output_layer: ',self.output_layer['weights'].shape)

    def fit(self, x, y, ephochs= ephochs):
        for i in range(ephochs):
            # feed forword
            z_hidden_layer = np.dot(x[i], self.hidden_layer['weights']) + self.hidden_layer['biases']
            o_hidden_layer = sigmoid(z_hidden_layer)

            z_output_layer = np.dot(o_hidden_layer, self.output_layer['weights']) + self.output_layer['biases']
            o_output_layer = sigmoid(z_output_layer)

            # back propagation
            error = o_output_layer - y[i]

            '''
            ## at output layer 

            derror_dweights = derror/do * do/dz * dz/dw

            derror/do = error
            do/dz = derivative of sigmoid(x[i]) 
            dz/dw = o_hidden_layer
            ''' 
            derror_do = error 
            do_dz =  sigmoid(z_output_layer, derivative=True)
            dz_dw =  o_hidden_layer

            nw_output_layer = derror_do * do_dz
            nw_output_layer = np.dot(nw_output_layer, dz_dw.T) 

            nb_output_layer = error

            # updating new weights and biases
            self.output_layer['weights'] = self.output_layer['weights'] - (self.learning_rate * nw_output_layer)
            self.output_layer['biases'] = self.output_layer['biases'] - (self.learning_rate * nb_output_layer)

            ## update remain weights and biases

当我跑步时,我得到了这个错误

nw_output_layer = np.dot(nw_output_layer, dz_dw.T) ValueError: shapes (10,) and (100,) not aligned: 10 (dim 0) != 100 (dim 0)

谁能逐步解释更新这个神经网络的权重和偏差的过程?

标签: python-3.xnumpyneural-networkdeep-learning

解决方案


在神经网络中,您必须将数据预处理成相同的形状。您可以尝试在函数内预处理数据。因此,您必须简单地调用相同的函数来预处理测试数据。这将防止为不同的数据获得不同的形状。

更新权重以测量用于分离数据的超平面。例如,

在二元分类中,你用斜率填充 find 线,用线方程 Y = MX + B 分离两个类。同样的方法,你需要通过梯度下降算法用超平面分离多维数据。

W = W - 学习率 * delta

这里的 delta 是损失的偏导数。通过更新权重,您可以减少损失。在某一点上,损失将达到某个局部最小值。此时(局部最小值)停止历元(迭代次数以找到最佳精度)。

要更新权重,您可以使用一些批量大小的 for 循环。在神经网络中,您必须找到适合您数据的学习率和时期。如果您使用的学习率非常低,则会减慢您的训练速度。


推荐阅读