首页 > 解决方案 > tensorflow keras 评估函数

问题描述

该函数是如何evaluate真正工作的,它究竟返回了什么?

这是evaluate来自文档(来自tf.keras.models.Model)的接口定义。

evaluate(
    x=None,
    y=None,
    batch_size=None,
    verbose=1,
    sample_weight=None,
    steps=None,
    max_queue_size=10,
    workers=1,
    use_multiprocessing=False
)

文档说该函数在测试模式下返回模型的损失值和指标值。

2个参数在这里很重要:

batch_size:整数或无。每次梯度更新的样本数。如果未指定,batch_size 将默认为 32。如果您的数据是符号张量、数据集、数据集迭代器、生成器或 keras.utils.Sequence 实例的形式(因为它们会生成批次),请不要指定 batch_size。

步骤:整数或无。宣布评估轮结束之前的步骤总数(样本批次)。忽略默认值无。

文档对我来说有点模糊。我不明白句子中的数据集是什么意思“如果您的数据是符号张量,数据集...的形式,请不要指定batch_size。”

就我而言,我的模型有多个输入,输入x是一个 numpy 数组列表。我的 x 如下所示:

print(len(x))        returns   4
print(x[0].shape)    returns   (128, 9, 16)

重要的是数据集(即本例中的训练集)中有 128 个示例。

虽然是这种情况,但我对应该如何调用评估函数感到非常困惑?我特别想知道我应该如何设置batch_sizesteps参数。

我可以按如下方式运行它:

备选方案 1:

train_metrics = saved_model.evaluate(x          = train_x,
                                     y          = train_y,
                                     batch_size = None, 
                                     steps      = None)

或者我也可以按以下方式运行它:

备选方案 2:

train_metrics = saved_model.evaluate(x          = train_x,
                                     y          = train_y,
                                     batch_size = 64, 
                                     steps      = None)

鉴于我拥有上述格式的数据集,两种选择之间有什么区别。我实际上希望看到相同的结果(特别是“损失”),因为评估函数应该只遍历给定的数据集一次,并且应该返回整个数据集的结果。但它没有发生。上面的 2 个替代方案给出了截然不同的结果。

有谁清楚地知道这两个电话之间有什么区别?

我也尝试检查代码,但无法真正弄清楚细节..

标签: tensorflowmachine-learningkerasneural-network

解决方案


 我不明白句子中的数据集是什么意思“如果您的数据是符号张量的形式,请不要指定batch_size,数据集......”

这里提到的数据集是 的一个实例tf.data.Dataset()。数据集batch_size已定义。我们使用以下方式定义它:

tf.data.Dataset.batch( batch_size )

evaluate因此,Keras方法中不需要参数。

steps论据是什么?

步长是样本总数除以批量大小。如果我有 1000 个样本且 batch_size 为 50,那么步数将为 20( 1000 / 50 )。steps大多数情况下,您不需要输入参数。

对于第一种选择:

批量大小设置为无。因此,将使用默认值 32。因此,在这里,根据计算,步数将为 4 ( 128 / 32 )。

对于第二种选择:

批量大小设置为 64。因此,在这里,根据计算,步数将为 2(128 / 64)。

替代品之间的差异:

两种替代方案都有不同的批量大小,分别为 32 和 64。因此,损失和准确度的计算将不同。


推荐阅读