tensorflow keras评估函数

时间:2019-03-07 12:46:36

标签: tensorflow machine-learning keras neural-network

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
)

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

这里有两个参数很重要:

  

批处理大小:整数或无。每个梯度更新的样本数。如果   未指定,batch_size将默认为32。请勿指定   batch_size(如果您的数据采用符号张量,数据集,   数据集迭代器,生成器或keras.utils.Sequence实例   (因为它们会生成批次)。

     

步骤:整数或无。总步骤数(一批样品)   在宣布评估轮结束之前。忽略了   默认值为无。

文档对我来说有点含糊。我不明白“请勿指定以下内容”一词中的 数据集 是什么意思 batch_size(如果您的数据采用符号张量的形式), 数据集 ....”

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

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

重要的是,数据集(在此示例中为训练集)中包含128个示例。

在这种情况下,我对如何调用评估函数感到非常困惑?我特别想知道如何设置 batch_size steps 参数。

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

替代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个替代方案之间有什么区别?我实际上希望看到相同的结果(尤其是“丢失”),因为评估函数应该只遍历给定的数据集一次,并且应该为整个数据集返回结果。但这没有发生。上面的2个选择给出的结果截然不同。

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

我也尝试检查代码,但无法真正找出细节。

1 个答案:

答案 0 :(得分:2)

  

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

此处引用的数据集是tf.data.Dataset()的实例。数据集已经定义了其batch_size。我们使用以下命令定义它:

tf.data.Dataset.batch( batch_size )

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

  

steps参数是什么?

步长是将样本总数除以批次大小的时间。如果我有1000个样本,并且batch_size为50,则步骤数将为20(1000/50)。您不需要主要输入steps参数。

第一替代方案:

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

第二种替代方法:

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

替代方案之间的区别:

这两种选择的批次大小分别为32和64。因此,损失和准确性的计算方式会有所不同。