Python 分别对每个批处理元素调用Keras Model.evaluate()
我想对我的一批测试数据调用Python 分别对每个批处理元素调用Keras Model.evaluate(),python,tensorflow,keras,Python,Tensorflow,Keras,我想对我的一批测试数据调用tf.keras.Model.evaluate()(或类似的方法),并且我想分别获得每个批次元素的损失/指标。因此,如果批次长度为64个元素,我希望返回一个包含64个损失/指标的列表 我需要这个,以便在测试数据集中找到异常值 我试着在批处理()上调用test\u,或者在单个批处理上调用evaluate(),但是这个方法聚合了批处理结果(我假设是通过平均值),并且对每个元素单独进行批处理,虽然可能,但在我的GPU上要花费10-20倍的时间 我还尝试调用predict()并
tf.keras.Model.evaluate()
(或类似的方法),并且我想分别获得每个批次元素的损失/指标。因此,如果批次长度为64个元素,我希望返回一个包含64个损失/指标的列表
我需要这个,以便在测试数据集中找到异常值
我试着在批处理()上调用test\u,或者在单个批处理上调用evaluate(),但是这个方法聚合了批处理结果(我假设是通过平均值),并且对每个元素单独进行批处理,虽然可能,但在我的GPU上要花费10-20倍的时间
我还尝试调用predict()并手动计算损失/指标,但这种方法的性能也会急剧下降(从测试数据集和预测中计算每个损失/指标的后续手动步骤)
有没有一种方法可以在不影响性能的情况下做到这一点?将TensorFlow度量/损失函数与
模型一起使用。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\u eval
等于tf.reduce\u mean(scce)
scca\u eval
等于tf.reduce\u mean(scca)
评估中涉及哪些损失/指标?@MarcoCerliani这是mnist上的一个非常简单的例子,所以SparseCategoricCrossentity和SparseCategoricAcacacaccuracy,但这对问题不重要,对吗?谢谢@MarcoCerliani,这似乎是一个很好的方法。我想知道,因为我正在构建一个外部库,其中的score函数可能不同,或者是各种度量的组合,是否有任何方法可以在不调用单个度量/损失函数的情况下计算它,因为Keras已经拥有了所有的信息。有没有办法要求Keras模型返回其当前编译的损失函数,或者任何其他已编译的指标,例如?我在评论中说u(在评论中)出于这个原因涉及的指标/损失。。。如果你有自己的自定义损失/指标,你必须在最后写下它,而不是平均减少。这样,在拟合过程中,标准keras模型将自行计算平均减少量,而在评估过程中,u将可以按照我显示u的方式自由获得批次分数(使用相同的函数)。。。如果你保留它的价值,别忘了投赞成票并接受它作为答案;-)
scce_eval, scca_eval = model.evaluate(X,y, verbose=0)