我想评估一个模型,同时也捕获倒数第二层的激活。我使用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_))
所以:为什么predictions
和predictions_
不相等? model.predict
不应该与最后一层的输出相同吗?毕竟mode.predict
返回最后一层的输出。
您没有提供有关您的模型的详细信息,因此您只能猜测。一种可能性是您使用softmax crossentropy进行分类,在这种情况下,最后一层通常输出(非规范化)logits,而predict()
将softmax
应用于此输出以返回归一化概率。