在Michael Nielsens的书中解读前馈函数

时间:2018-05-28 13:08:42

标签: python neural-network deep-learning feed-forward

我正在阅读他那本很棒的书(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个条目的数组 - >这让我头疼。 无论是对这些条目求和,也不对它们求平均值似乎都给出了一个接近所需(0,0,0,0,1,0,0,0,0,0)的东西,你想要的是4的图像。 更奇怪的部分是,代码的其余部分似乎假设它将得到这样:

    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。

尽管如此,代码似乎有效 - 这让我发疯了。解释这个结的原因是什么?

1 个答案:

答案 0 :(得分:0)

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

希望这有帮助

[编辑]

来自Numpy docs for argmax:

  

axis:int,可选。默认情况下,索引进入展平数组,否则沿指定轴。

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