为什么model.predict与最后一层(keras)的输出不同?

问题描述 投票:1回答:1

我想评估一个模型,同时也捕获倒数第二层的激活。我使用this answer作为解决方案。我用pen_ulti_activs = layer_outs[-2]访问倒数第二次激活。

但是为了仔细检查该解决方案是否真的有效,我在我的代码中放置了一个断言,通过比较functor返回的最后一层激活与model.predict返回的数组,验证来自functor的激活实际上与model.predict的激活相匹配。但断言失败了。所以我想我误解了如何使用链接的答案。

from keras import backend as K


def evaluate_model(model, test_gen):


    inp = model.input                                           # input placeholder
    outputs = [layer.output for layer in model.layers]          # all layer outputs
    functor = K.function([inp, K.learning_phase()], outputs )   # evaluation function


    for inputs, targets in test_gen:

        layer_outs = functor([inputs, 1.])


        predictions = layer_outs[-1]

        predictions_ = model.predict(inputs)

        assert(np.allclose(predictions, predictions_))

所以:为什么predictionspredictions_不相等? model.predict不应该与最后一层的输出相同吗?毕竟mode.predict返回最后一层的输出。

python tensorflow keras neural-network deep-learning
1个回答
1
投票

您没有提供有关您的模型的详细信息,因此您只能猜测。一种可能性是您使用softmax crossentropy进行分类,在这种情况下,最后一层通常输出(非规范化)logits,而predict()softmax应用于此输出以返回归一化概率。

© www.soinside.com 2019 - 2024. All rights reserved.