1

我目前正在阅读他的好书(http://neuralnetworksanddeeplearning.com/chap1.html),我认为到目前为止我已经很好地掌握了这些内容。数学需要一些思考,但易于管理。

对我来说根本不想理解的是前馈函数的作用以及它是如何工作的。现在我无法得到它,所以我决定我需要在这里创建一个 acc 并寻求帮助。

    def feedforward(self, a):
    """Return the output of the network if ``a`` is input."""
    for b, w in zip(self.biases, self.weights):
        a = sigmoid(np.dot(w, a)+b)
    return a

你现在可能会说:“嘿,这很简单,有什么不能理解的”,基本上你是对的。但让我感到困扰的是,这个网络应该对数字进行分类——而且代码似乎工作得很好。如果我在我的机器上运行它,它会向我显示它应该做的进度。所以结果net.feedforward(image)应该是一个包含 10 个条目的数组,指示网络将我们的图片分类为哪个数字。但实际输出是一个包含 10 乘以 30 个条目的数组 --> 这让我很头疼。无论是对这些条目求和,还是对它们求平均值,似乎都没有给出接近 4 图像所需的 (0,0,0,0,1,0,0,0,0,0) 的值。偶数更奇怪的是,其余的代码似乎假设它会得到这个:

    def evaluate(self, test_data):
    """Return the number of test inputs for which the neural
    network outputs the correct result. Note that the neural
    network's output is assumed to be the index of whichever
    neuron in the final layer has the highest activation."""
    test_results = [(np.argmax(self.feedforward(x)), y)
                    for (x, y) in test_data]
    return sum(int(x == y) for (x, y) in test_results)

如果我这样做:test=net.feedforward(image)然后使用np.argmax(test)我得到一个任意结果,具体取决于 0 到 299 之间的输入,而不是函数中预期的 0 到 9。

尽管如此,代码似乎工作 - 这让我发疯。对此有何解释可以解决我脑海中的问题?

4

1 回答 1

0

基本上,您的前馈函数为每个输入返回 10 个 sigmoid 值,每个值都表示网络对该输出的“确定性”程度。为了检索每个输入的正确预测,您必须将轴参数传递给 argmax 函数,否则输出是整个输出中最大值的索引。您需要的是每个 COLUMN (或行,表示每个样本的那个)的最大值。

希望这可以帮助

[编辑]

来自 argmax 的 Numpy 文档:

轴:int,可选。默认情况下,索引位于展平数组中,否则沿指定轴。

这告诉你为什么你得到错误的结果

于 2018-05-28T13:50:46.827 回答