自制的神经网络无法检测手写数字,但是对于其他基准数据集也可以正常工作

时间:2019-12-27 23:39:01

标签: python neural-network mnist softmax

我从头开始创建了一个神经网络。对于某些基准数据集(例如鸢尾花,月球等),它可以正常工作,但对于MNIST数据集而言,它却失败了。我已多次检查该代码,但未能找到任何错误。

我尝试了激活功能的不同组合以及很高的学习率-500、1000等。我还尝试了不同的体系结构;有许多神经元的几层。他们都没有工作。

请注意,calculate_delta_final和softmax函数的导数可能看起来有些奇怪,这是因为我试图同时促进均方误差和分类交叉熵。 因为softmax的dZL直接是(Y_hat-Y),所以尽管softmax的导数不是1,但我为softmax的导数返回1。

由于我不知道是什么原因造成的,我很遗憾正在共享整个笔记本。链接到笔记本在这里:

https://github.com/mcagriardic/Andrew-NG-Coursera/blob/master/ex4/NeuralNetwork_class.ipynb

1 个答案:

答案 0 :(得分:0)

我已经解决了问题。这个问题是由于我初始化体重的方式引起的:

initialise_weights()函数的先前代码为:

    def initialise_weights(self, layer=None):
    self.W = np.empty_like(range(self.layers), dtype=object)
    self.B = np.empty_like(range(self.layers), dtype=object)
    self.W[0] = None
    self.B[0] = None
    for layer, (y, x) in zip(range(1, self.layers), self.weight_set_dimensions):
        np.random.seed(self.seed)
        self.W[layer] = np.random.rand(y, x)
        self.B[layer] = np.random.rand(y, 1)

用np.sqrt(self.dimensions [layer-1])项除以初始权重后,问题得以解决。

    def initialise_weights(self, layer=None):
    self.W = np.empty_like(range(self.layers), dtype=object)
    self.B = np.empty_like(range(self.layers), dtype=object)
    self.W[0] = None
    self.B[0] = None
    for layer, (y, x) in zip(range(1, self.layers), self.weight_set_dimensions):
        np.random.seed(self.seed)
        self.W[layer] = np.random.rand(y, x) / np.sqrt(self.dimensions[layer - 1])
        self.B[layer] = np.random.rand(y, 1)