我从头开始创建了一个神经网络。对于某些基准数据集(例如鸢尾花,月球等),它可以正常工作,但对于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
答案 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)