分别对每个批处理元素调用 Keras Model.evaluate()

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

我想对一批 test_data 调用

tf.keras.Model.evaluate()
(或类似的方法),并且我想分别获取每批 element 的损失/指标。因此,如果批次的长度为 64 个元素,我想要返回 64 个损失/指标的列表。

我需要这个来查找测试数据集中的异常值。

我尝试在单个批次上调用test_on_batch()或evaluate(),但此方法聚合批次结果(我假设通过平均值),并且单独批处理每个元素,尽管可能,但在我的GPU上花费了10-20倍的时间。

我还尝试调用predict()并手动计算损失/指标,但这种方法也遭受性能急剧下降的困扰(从测试数据集和预测中计算每个损失/指标的后续所需手动步骤)

有没有办法在不影响性能的情况下做到这一点?

python tensorflow machine-learning keras deep-learning
1个回答
2
投票

将 TensorFlow 度量/损失函数与

model.predict()
结合使用速度很快且不涉及循环

考虑这个虚拟分类任务:

X = np.random.uniform(0,1, (64,28,28,1))
y = np.random.randint(0,2, 64)

model = Sequential([Flatten(), Dense(2, activation='softmax')])
model.compile('adam', 
              loss=tf.keras.losses.SparseCategoricalCrossentropy(), 
              metrics=[tf.keras.metrics.SparseCategoricalAccuracy()])
model.fit(X,y, epochs=3)

您可以通过这种方式评估每个批次元素的分数:

scce = tf.keras.losses.sparse_categorical_crossentropy(y, model.predict(X))
# scce.shape ==> (64,)

scca = tf.keras.metrics.sparse_categorical_accuracy(y, model.predict(X))
# scca.shape ==> (64,)

这些分数与

model.evaluate()

汇总的分数相同
scce_eval, scca_eval = model.evaluate(X,y, verbose=0)

scce_eval
等于
tf.reduce_mean(scce)

scca_eval
等于
tf.reduce_mean(scca)

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